c++ map 插入失败,请大家过来看看! 本帖最后由 VisualEleven 于 2012-11-29 15:41:49 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 我发现现在是第一次循环时值能插入,以后都不能插入!为啥啊?我明明把key的成员变量的值修改了啊! 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 ??? 果然是这个问题哭死我已经连续2个月没休息了,每天加班到后半夜3~4点。。修改返回值以后200个值都能存进去了,但是执行到上面126行的find函数时断言失败了!提示我“invalid operator <”我重载的<操作符有问题么??怎么会让编译器断言呢 #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; } 果然是这个问题哭死我已经连续2个月没休息了,每天加班到后半夜3~4点。。修改返回值以后200个值都能存进去了,但是执行到上面126行的find函数时断言失败了!提示我“invalid operator <”我重载的<操作符有问题么??怎么会让编译器断言呢 可怜的孩子啊! 这个问题我遇到过,我好奇的是VC的错误检查方法,能够指出<有问题。但由于是模板实现的,不那么直观。 STL最烂的地方就是错误报告了。用STL只能靠自己经验了。 sd.sow = i; sd.time_ms = i; 请问这两个数为什么要递增才能插入成功?如果其中一个值不变,另一个递增则只能插入一次,剩下全失败。再如果其中一个递增,另一个递增到100转而递减,则只能插入到100,剩下的转成递减的则全部失败!这是为啥啊?? map的第一个数据就是key,不允许有重复。 有重复的用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 大家帮忙看看,一个小WIN32API程序,为什么菜单显示不出啊? 串口通信与及时绘图的问题 listcontrol怎么进行互相拖拽 单文档的工程,OnDraw时的问题 如何解析网址?获取域名和资源名,在线等,急急急!!! 关于COM实现基础的问题,小弟最后90分,跳楼大甩卖 简单:关于多视图程序问题。 TreeCtrl技巧问题 驱动编程如何由进程句柄获得进程名 高分 VS 高人:Exchange 2000 VS Lotus Notes unicode字符12539输出不了求助 C++ 库函数大全手册完整版
{
if (Sow > t.Sow)
{
return false;
}
if (Time_ms > t.Time_ms)
{
return false;
}
return false;
}
这个函数都返回false ???
果然是这个问题哭死我已经连续2个月没休息了,每天加班到后半夜3~4点。。修改返回值以后200个值都能存进去了,但是执行到上面126行的find函数时断言失败了!
提示我“invalid operator <”我重载的<操作符有问题么??怎么会让编译器断言呢
#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;
}
提示我“invalid operator <”我重载的<操作符有问题么??怎么会让编译器断言呢 可怜的孩子啊!
但由于是模板实现的,不那么直观。
sd.time_ms = i; 请问这两个数为什么要递增才能插入成功?如果其中一个值不变,另一个递增则只能插入一次,剩下全失败。
再如果其中一个递增,另一个递增到100转而递减,则只能插入到100,剩下的转成递减的则全部失败!
这是为啥啊??
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