本帖最后由 VisualEleven 于 2012-11-29 15:41:49 编辑

解决方案 »

  1.   

    我发现现在是第一次循环时值能插入,以后都不能插入!为啥啊?我明明把key的成员变量的值修改了啊!
      

  2.   

    bool operator < (const SF_data_key &t) const  
    {    
    if (Sow > t.Sow)     
    {          
    return false;    
    }     
    if (Time_ms > t.Time_ms)   
    {         
    return false;    
    }     
    return false;   
    }  
    这个函数都返回false ???
      

  3.   


    果然是这个问题哭死我已经连续2个月没休息了,每天加班到后半夜3~4点。。修改返回值以后200个值都能存进去了,但是执行到上面126行的find函数时断言失败了!
    提示我“invalid operator <”我重载的<操作符有问题么??怎么会让编译器断言呢
      

  4.   

    #include "stdafx.h"  
    #include <Windows.h>  
    #include <iostream>  
    #include <map>  
    using namespace std;  
    typedef struct _sfdata 
    {     
    int sow;   
    long long time_ms;      
    char datat[256];  
    }sfdata;  class SF_data_key 
    {  
    private:    
    int Sow;   
    long long Time_ms;  
    public:     
    SF_data_key() :Sow(0), Time_ms(0)      
    {  
    }   
    ~SF_data_key()     

    }   
    SF_data_key(const SF_data_key &t)   
    {      
    Sow = t.Sow;          
    Time_ms = t.Time_ms;   
    }  
    SF_data_key &operator = (const SF_data_key &t) 
    {     
    Sow = t.Sow;    
    Time_ms = t.Time_ms;    
    return *this;   
    }   
    bool operator == (const SF_data_key &t) const   
    {       
    if ((Sow == t.Sow) && (Time_ms == t.Time_ms))    
    {         
    return true;   
    }         
    return false;  
    }  
    bool operator > (const SF_data_key &t) const 
    {      
    if ((Sow > t.Sow) && (Time_ms > t.Time_ms))    
    {        
    return true;      
    }      
      
    return false; 
    }   
    bool operator < (const SF_data_key &t) const  
    {    
    if ((Sow < t.Sow) && (Time_ms < t.Time_ms))     
    {          
    return true;    
    }     
        
    return false;   
    }  
    void format(sfdata &d) 
    {      
    Sow = d.sow;    
    Time_ms = d.time_ms;  
    }  
    SF_data_key &format(int type, int d) 
    {       
    switch (type) 
    {     
    case 3://3秒时隙      
    if (d % 3 == 0)    
    {    
    Sow = d + 1;     
    Time_ms = 0;
    }          
    else if (d % 3 == 1)   
    {          
    Sow = d + 1;       
    Time_ms = 500;    
    }         
    break;      
    case 6://6秒时隙     
    Sow = d + 3;    
    Time_ms = 0;      
    break;       
    case 12://12秒时隙     
    Sow = d + 6;       
    Time_ms = 0;       
    break;        
    default:          
    break;     
    }     
    return *this; 

    };int _tmain(int argc, _TCHAR* argv[])
    {  
    map<SF_data_key,sfdata>memdata;   
    map<SF_data_key,sfdata>::iterator iter;  
    for (int i = 0; i < 200; i++) 
    {      
    sfdata sd; 
    sd.sow = i;    
    sd.time_ms = i;   
    memset(sd.datat,0,sizeof(sd.datat)); 
    sprintf(sd.datat,"数据 = %d",i); 
    SF_data_key mykey;   
    mykey.format(sd); 
    //memdata.insert(map<SF_data_key,sfdata>::value_type(mykey,sd));   
    pair<map<SF_data_key,sfdata>::iterator,bool>ret = memdata.insert(make_pair(mykey,sd));  
    if (!ret.second)    
    {        
    cout<<"插入失败!"<<endl;   

    }  
    cout<<memdata.size()<<endl;
    while(1)  
    {   
    cout<<"输入要查询的秒计数0~199:"<<endl;    
    int sec = 0;      
    cin>>sec;   
    SF_data_key mykey;      
    mykey.format(3,sec);   
    iter = memdata.find(mykey);   
    if(memdata.end() != iter)
    cout<<iter->second.datat<<endl;  
    }    
    return 0;  
      

  5.   

    果然是这个问题哭死我已经连续2个月没休息了,每天加班到后半夜3~4点。。修改返回值以后200个值都能存进去了,但是执行到上面126行的find函数时断言失败了!
    提示我“invalid operator <”我重载的<操作符有问题么??怎么会让编译器断言呢 可怜的孩子啊!
      

  6.   

    这个问题我遇到过,我好奇的是VC的错误检查方法,能够指出<有问题。
    但由于是模板实现的,不那么直观。
      

  7.   

    STL最烂的地方就是错误报告了。用STL只能靠自己经验了。
      

  8.   

    sd.sow = i;           
      sd.time_ms = i;  请问这两个数为什么要递增才能插入成功?如果其中一个值不变,另一个递增则只能插入一次,剩下全失败。
    再如果其中一个递增,另一个递增到100转而递减,则只能插入到100,剩下的转成递减的则全部失败!
    这是为啥啊??
      

  9.   

    map的第一个数据就是key,不允许有重复。
      

  10.   

    有重复的用multimap:
    multimap<string,string> dns;dns.insert(make_pair("192.168.1.19","www.kfqcome.com"));dns.insert(make_pair("192.168.1.19","kfqcome.com"));dns.insert(make_pair("192.168.1.19","www.kfqcome.org"));   看看这个网页:
    http://www.cnblogs.com/kfqcome/archive/2011/06/18/2137002.html