c++ map 插入失败,请大家过来看看!

ATMCash4423 2012-11-29 03:38:01
提示插入失败。


// maptest.cpp : 定义控制台应用程序的入口点。 //
#include "stdafx.h"
#include <Windows.h>
#include <iostream>
#include <map>
using na
mespace 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)
{
return false;
}
if (Time_ms != t.Time_ms)
{
return false;
}
return true;
}
bool operator > (const SF_data_key &t) const
{
if (Sow < t.Sow)
{
return false;
}
if (Time_ms < t.Time_ms)
{
return false;
}
return true;
}
bool operator < (const SF_data_key &t) const
{
if (Sow > t.Sow)
{
return false;
}
if (Time_ms > t.Time_ms)
{
return false;
}
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 = 0;
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;
} }
while(1) {
cout<<"输入要查询的秒计数0~199:"<<endl;
int sec = 0;
cin>>sec;
SF_data_key mykey;
mykey.format(3,sec);
iter = memdata.find(mykey);
cout<<iter->second.datat<<endl;
} return 0;
}

手机不好排版,各位多包含啊!!
...全文
535 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
ATMCash4423 2012-11-30
  • 打赏
  • 举报
回复
sd.sow = i; sd.time_ms = i; 请问这两个数为什么要递增才能插入成功?如果其中一个值不变,另一个递增则只能插入一次,剩下全失败。 再如果其中一个递增,另一个递增到100转而递减,则只能插入到100,剩下的转成递减的则全部失败! 这是为啥啊??
hztj2005 2012-11-30
  • 打赏
  • 举报
回复
有重复的用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
ATMCash4423 2012-11-30
  • 打赏
  • 举报
回复
引用 9 楼 hztj2005 的回复:
map的第一个数据就是key,不允许有重复。
我第一个变量已经改变了啊,只改一个变量不行么?个必须都不一样才行?
hztj2005 2012-11-30
  • 打赏
  • 举报
回复
map的第一个数据就是key,不允许有重复。
傻X 2012-11-29
  • 打赏
  • 举报
回复
STL最烂的地方就是错误报告了。 用STL只能靠自己经验了。
hztj2005 2012-11-29
  • 打赏
  • 举报
回复
这个问题我遇到过,我好奇的是VC的错误检查方法,能够指出<有问题。 但由于是模板实现的,不那么直观。
playStudy 2012-11-29
  • 打赏
  • 举报
回复
果然是这个问题。。。哭死。。。我已经连续2个月没休息了,每天加班到后半夜3~4点。。 修改返回值以后200个值都能存进去了,但是执行到上面126行的find函数时断言失败了! 提示我“invalid operator <” 我重载的<操作符有问题么??怎么会让编译器断言呢。。。 可怜的孩子啊!
Eleven 2012-11-29
  • 打赏
  • 举报
回复
#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;  
}
ATMCash4423 2012-11-29
  • 打赏
  • 举报
回复
引用 2 楼 VisualEleven 的回复:
C/C++ code?123456789101112bool operator < (const SF_data_key &t) const { if (Sow > t.Sow) { return false; } if ……
果然是这个问题。。。哭死。。。我已经连续2个月没休息了,每天加班到后半夜3~4点。。 修改返回值以后200个值都能存进去了,但是执行到上面126行的find函数时断言失败了! 提示我“invalid operator <” 我重载的<操作符有问题么??怎么会让编译器断言呢。。。
Eleven 2012-11-29
  • 打赏
  • 举报
回复
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 ???
ATMCash4423 2012-11-29
  • 打赏
  • 举报
回复
我发现现在是第一次循环时值能插入,以后都不能插入!为啥啊?我明明把key的成员变量的值修改了啊!

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧