免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 10094 | 回复: 10
打印 上一主题 下一主题

[C++] 晕倒!stl map 插入值失败 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-07-17 08:50 |只看该作者 |倒序浏览
我在向一个map容器中插入第二个键值对时发生失败程序报段错误,而插入第一个键值对是正常的
gdb跟踪时显示以下信息

这个map的定义如下 map<int,RECORD_STRUCT>,RECORD_STRUCT是一个结构体

  1. Program received signal SIGSEGV, Segmentation fault.
  2. 0x000000000040ecac in std::less<int>::operator() (this=0x7fbffff7f2, __x=@0x7fbffd6030, __y=@0x5195a00000001c) at stl_function.h:227
  3. 227           { return __x < __y; }
  4. (gdb) where
  5. #0  0x000000000040ecac in std::less<int>::operator() (this=0x7fbffff7f2, __x=@0x7fbffd6030, __y=@0x5195a00000001c) at stl_function.h:227
  6. #1  0x000000000040debd in std::_Rb_tree<int, std::pair<int const, RECORD_STRUCT>, std::_Select1st<std::pair<int const, RECORD_STRUCT> >, std::less<int>, std::allocator<std::pair<int const, RECORD_STRUCT> > >::insert_unique (this=0x7fbffff7f2, __v=@0x7fbffd6030) at stl_tree.h:869
  7. #2  0x000000000040cf83 in std::map<int, RECORD_STRUCT, std::less<int>, std::allocator<std::pair<int const, RECORD_STRUCT> > >::insert (
  8.     this=0x7fbffff7f2, __x=@0x7fbffd6030) at stl_map.h:360
  9. #3  0x000000000040a4b9 in CFEESND_FIELD::ReadAsnFile (this=0x7fbfffa620) at tablesndfield.cpp:291
  10. #4  0x0000000000410dad in main (argc=2, argv=0x7fbffff938) at main.cpp:44
复制代码

论坛徽章:
0
2 [报告]
发表于 2008-07-17 09:17 |只看该作者
贴代码

论坛徽章:
0
3 [报告]
发表于 2008-07-17 11:10 |只看该作者
mapVar.insert( make_pair ( intVar, RECORD_STRUCT_Var) )
我这样用的,使用前,结构体初始化了

论坛徽章:
0
4 [报告]
发表于 2008-07-17 11:46 |只看该作者
要事先定义 RECORD_STRUCT 的 operator< 或者传入一个比较函数吧。

论坛徽章:
0
5 [报告]
发表于 2008-07-17 14:23 |只看该作者
我是这样进行插入的呀
m_mapRecStruct.insert(make_pair(iSerType,RecTemp));
4楼的说
要事先定义 RECORD_STRUCT 的 operator<
但是RECORD_STRUCT仅仅是一个结构体,怎么定义运算符重载函数呢

论坛徽章:
0
6 [报告]
发表于 2008-07-17 14:27 |只看该作者
我在使用前有对这些结构体进行赋值操作

论坛徽章:
0
7 [报告]
发表于 2008-07-17 14:40 |只看该作者
原帖由 emacsnw 于 2008-7-17 11:46 发表
要事先定义 RECORD_STRUCT 的 operator< 或者传入一个比较函数吧。


定义operator< 仅针对map的key,而这里是int,默认的operate<就可以了.

论坛徽章:
0
8 [报告]
发表于 2008-07-17 16:41 |只看该作者
//test.cpp


#include <iostream>
#include <map>

using namespace std;

typedef struct RECORD_STRUCT
{
&nbsp;&nbsp;&nbsp;&nbsp;int a;
&nbsp;&nbsp;&nbsp;&nbsp;long b;
};


int main()
{
&nbsp;&nbsp;&nbsp;&nbsp;map<int,RECORD_STRUCT> mVar;
&nbsp;&nbsp;&nbsp;&nbsp;map<int,RECORD_STRUCT>::iterator iter;
&nbsp;&nbsp;&nbsp;&nbsp;RECORD_STRUCT record;

&nbsp;&nbsp;&nbsp;&nbsp;record.a=100;
&nbsp;&nbsp;&nbsp;&nbsp;record.b=200;
&nbsp;&nbsp;&nbsp;&nbsp;mVar.insert( make_pair( 1, record) );

&nbsp;&nbsp;&nbsp;&nbsp;iter=mVar.begin();
&nbsp;&nbsp;&nbsp;&nbsp;cout<<iter->first<<endl
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<<iter->second.a<<endl
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<<iter->second.b<<endl;


&nbsp;&nbsp;&nbsp;&nbsp;return 0;
}



运行结果
1
100
200

论坛徽章:
0
9 [报告]
发表于 2008-07-17 18:11 |只看该作者
贴代码,请不要让人去猜哪出错了

论坛徽章:
0
10 [报告]
发表于 2008-09-23 10:10 |只看该作者

这个问题我遇到过

可能是你的RECORD_STRUCT拷贝构造函数有缺陷.RECORD_STRUCT里面有指针吧!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP