博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++代码问题(segment fault)
阅读量:5892 次
发布时间:2019-06-19

本文共 2512 字,大约阅读时间需要 8 分钟。

hot3.png

 
 
#include 
#include
#include
#include
#include
using namespace std;/*int main(){ int a; a = 10; cout<<" "<<
subnode; vector
clid; set
nlid;}comcross;void init1(vector
&com_vec,map
> &map_com);void init2(vector
&com_vec, map
> &map_com);int main(){ vector
com_vec; map
> map_com; init1( com_vec,map_com); init2( com_vec,map_com); for(vector
::iterator iter = com_vec.begin();iter != com_vec.end();++iter) { for(set
::iterator iter1 = iter->nlid.begin();iter1 != iter->nlid.end();++iter1) { cout<<" "<<*iter1; } } system("pause"); return 0;}void init1( vector
&com_vec,map
> &map_com){ string A[] = {"1","2","3","4"}; string B[] = {"3","5","6","7"}; string C[] = {"7","8","9","10"}; string D[] = {"4","10","11","12"}; //初始化map_com vector
tmp1(A,A+4),tmp2(B,B+4),tmp3(C,C+4),tmp4(D,D+4); map_com["A"]=tmp1; map_com["B"]=tmp2; map_com["C"]=tmp3; map_com["D"]=tmp4; //初始化com_vec comcross com; com.id = "A"; string clid[]={"1","2","5","6","8","9","11","12"}; vector
tmp5(clid,clid+8); com.clid = tmp5; string subnode[] = {"B","C","D"}; vector
tmp6(subnode,subnode+3); com.subnode = tmp6; string nlid[] ={"1","2","3","4"}; vector
tmp7(nlid,nlid+4); com.nlid.insert(tmp7.begin(),tmp7.end()); com_vec.push_back(com);}void init2(vector
&com_vec, map
> &map_com){ vector
:: iterator iter = com_vec.begin(); for(;iter != com_vec.end();++iter) { for(vector
:: iterator subiter1 = iter->subnode.begin();subiter1 != iter->subnode.end();++subiter1) { string subnodekey = *subiter1; map
>::iterator mapit = map_com.find(subnodekey); if(mapit!=map_com.end()){ iter->nlid.insert(mapit->second.begin(),mapit->second.end()); } } } for(iter = com_vec.begin();iter != com_vec.end();++iter) { for(vector
::iterator subiter = iter->clid.begin();subiter != iter->clid.end();++subiter) { iter->nlid.erase(*subiter); } }}

输出:

1、为什么set输出不是顺序的呢????

C++ STL中标准关联容器set, multiset, map, multimap内部采用的就是一种非常高效的平衡检索二叉树:红黑树,也成为RB树(Red-Black Tree)。map和set的树建立之时就会自动排好序,

该set中字符串按照字典序排序,所以10排在3,4,7前面。。。

2、容器erase越界问题(Linux下segmentation fault(core dumped)问题)

容器erase操作之后返回下一个iterator,所以不要在循环内部做删除操作。

一般都是由内存访问越界造成的,不管是用户态程序还是内核态程序访问越界都会出core

在linux下一般使用gdb进行调试,避免这种问题就是在编写程序时,使用规范的逻辑,和保证健壮性的判断

小测试:

#include
int main(){ int *p; *p=12; return 1;}
在程序中对非法地址p进行写操作,执行程序时显示segmentation fault。

#include
int main(){ int *p, temp; temp=*p; return 1;}
在程序中对p指向地址进行
非法读操作
,执行时显示segmentation fault。

转载于:https://my.oschina.net/u/347414/blog/173624

你可能感兴趣的文章
pixel2坑
查看>>
20135337朱荟潼 Linux第三周学习总结 ——Linux内核源代码简介
查看>>
开源工具、平台列表
查看>>
oracle 字段类型
查看>>
linux 内存布局以及tlb更新的一些理解
查看>>
C语言最后一次作业--总结报告
查看>>
wpf 自动完成comboxBox
查看>>
day11 作用域
查看>>
asyncio python中的异步IO处理模块
查看>>
CentOS 漏洞修补
查看>>
Systemverilog for design 笔记(四)
查看>>
111:TemplateView讲解
查看>>
Guava包学习---I/O
查看>>
elixir 高可用系列(三) GenEvent
查看>>
关于使用AIDL出现空指针的解决办法
查看>>
在Windows窗体中开发自定义的控件
查看>>
传值引用和调用引用的区别
查看>>
Linux & Oracle目录说明
查看>>
转:MySQL索引背后的数据结构
查看>>
Hive简介
查看>>