c++ map自定义比较函数,发生运行时越界。

#include <string>
#include <iostream>
#include <list>
#include <vector>
#include <set>
#include <map>
using namespace std;
bool compareStr(const string &,const string &);
int main()
{
vector<string> vstr{"abc","def","abcd","defgg","abcdef"};
set<string,decltype(compareStr)*> s1(compareStr);//s2类型定义提供比较操作函数类型指针如下,容器定义时候需要提供比较操作(一个用来比较的函数名字)
set<string,decltype(compareStr)*> s2(vstr.begin(),vstr.end());s1 = {"abc","def","abcd","abcdef"};
for(auto i : s1)cout << i << " ";
cout << endl;
for (auto i : s2)cout << i << " ";
cout << endl;return 0;}
bool compareStr(const string & s1,const string & s2)
{return (s1.size() > s2.size());
}
r@r:~/coml/c++/11/11.2/11.2.2$ ./123
Segmentation fault (core dumped)

为什么?

自定义比较操作要求定义类型时紧跟元素类型提供比较函数指针的类型,容器类型定义时候需要提供比较操作,如代码中的s2,s2容器定义的时候缺少了比较的操作(缺少函数名字),所以代码更改如下:


#include <string>
#include <iostream>
#include <list>
#include <vector>
#include <set>
#include <map>
using namespace std;bool compareStr(const string &,const string &);
void print_set(const set<string,decltype(compareStr)*> &);int main()
{
vector<string> vstr{"abc","def","abcd","defgg","abcdef"};//注意:下面两个set都是用了自定义的比较操作,每次定义类型的时候,尖括号中必须在元素类型之后
//紧跟比较操作的函数类型的指针,一般用decltype来实现,哪怕是定义打印函数时候,要求也是一样
//也就是从此刻开始,所有的关于s1,s2的类型的操作的函数,都必须遵守这个规则:类型部分含有两部分
//元素类型  + 比较函数的指针类型
set<string,decltype(compareStr)*> s1(compareStr);
set<string,decltype(compareStr)*> s2(compareStr);
s2 = {"abc","def","ghis","asdfasdf"};
s1 = {"abc","def","asdf","abcdef"};
cout << endl;
for (auto i : s2)cout << i << " ";
cout << endl;
print_set(s1);return 0;}
bool compareStr(const string & s1,const string & s2)
{return (s1.size() > s2.size());
}//下面定义一个s1,s2的打印函数,切记类型里面紧跟元素类型有自定义比较函数的类型的指针,切不可丢弃
//不然则发生错误
void print_set(const set<string,decltype(compareStr)*> & s)
{
for(auto i : s)cout << i << " ";
cout << endl;}

本次运行就没有问题了,运行结果如下:

asdfasdf ghis abc
abcdef asdf abc

如果打印函数的形式参数类型定义为   const set<string> &s 会发生什么情况呢,会造成如下错误:

2.cc:22:11: error: invalid initialization of reference of type ‘const std::set<std::__cxx11::basic_string<char> >&’ from expression of type ‘std::set<std::__cxx11::basic_string<char>, bool (*)(const std::__cxx11::basic_string<char>&, const std::__cxx11::basic_string<char>&)>’22 | print_set(s1);|           ^~
2.cc:10:16: note: in passing argument 1 of ‘void print_set(const std::set<std::__cxx11::basic_string<char> >&)’10 | void print_set(const set<string> &);

错误的大题意思是用set<string> &对象,初始化set<string,decltype(compareStr)*> & 类型对象是不合法的,也就是形参中元素定义类型时候少了紧跟在元素类型之后的比较类型函数的指针了

c++ 自定义比较函数,运行时发生segmentation fault相关推荐

  1. centos使用yum时提示Segmentation fault错误的深入研究

    头一次用CentOS,结果就遇到了在用yum时出现了centos使用yum时提示Segmentation fault,这个错误的解决方法网上不少,但是我测试了一下发现不是那么回事,最后几经研究终于搞定 ...

  2. Python可视化matplotlib自定义:运行时参数修改、自定义样式、默认样式+plt.style.use()

    Python可视化matplotlib自定义:运行时参数修改.自定义样式.默认样式+plt.style.use() 目录 Python可视化matplotlib自定义:运行时参数修改.自定义样式.默认 ...

  3. 人工机器:jetsonnano推理时出现 Segmentation fault(core dumped)

    前期配置:tensorrt+tensorflow+object_detection编译安装填坑教程!! 1.在使用此工程:https://github.com/dusty-nv/jetson-infe ...

  4. 多线程:一个线程在运行时发生异常会怎么样?

    Java中Throwable分为Exception和Error:  出现Error的情况下,程序会停止运行.  Exception分为RuntimeException和非运行时异常.  非运行时异常必 ...

  5. c/c++ g++默认编译调用成功,O2优化却发生Segmentation fault

    https://blog.csdn.net/qq_16097611/article/details/60500550

  6. 07|Serverless运行时:使用自定义运行时支持自定义编程语言

    这一讲我将带你了解如何自定义函数运行时. 我们知道 Serverless 应用的函数代码是在 FaaS 中运行的,到目前为止,你也只能选择 FaaS 平台支持的编程语言开发应用,而 FaaS 平台支持 ...

  7. Segmentation fault (core dumped)是什么意思

    "Segmentation fault (core dumped)" 是操作系统在程序运行时发生内存访问错误的提示.它表示程序试图访问未分配的内存或不属于其访问范围的内存,从而导致 ...

  8. 关于 xml 库运行时的segmentation fault 问题

    最近做一个项目,需要用到xml库加载xml文件.程序编译运行的环境是centos6.5+gcc4.7. 由于使用的centos6.5是简单安装的,因此一些依赖库都是自己下载rpm安装包安装,其中就包括 ...

  9. 22.Java之异常处理(异常介绍,异常体系图一览,运行时异常,编译异常,try-catch方式处理异常,throws异常处理,自定义异常,throws 和 throw 的区别)

    22.1.异常介绍 Java语言中,将程序执行中发生的不正常情况称为 "异常" (开发过程中的语法错误和逻辑错误不是异常) 执行过程中所发生的异常事件分为两大类: Error:Ja ...

最新文章

  1. MindSpore基本原理
  2. python采集cpu信息
  3. CountDownLatch——常用并发工具类
  4. Android SDK更新下载失败以及Studio首次安装取消自动下载SDK
  5. windows下手把手教你捕获数据包
  6. 在工作迷惘的寒冬感受亲情的温暖。
  7. java rpg对战_箭头键优先(java rpg游戏)
  8. 乐高收割机器人_乐高圣诞45002作品来啦!——驯鹿拉雪橇、圣诞树、圣诞棒棒糖...
  9. html5 box sizing,CSS 盒模型与box-sizing
  10. java private list_Java基础知识回顾之四 ----- 集合List、Map和Set
  11. Threat Risk Modeling Learning
  12. Mybatis复杂参数传参取参方式总结
  13. STM32之提升迷之自信(时钟的制作)
  14. SQL Server 数据库之数据约束
  15. SpringBoot 集成积木报表
  16. IO、NIO和Netty
  17. “华为杯”山东理工大学第十一届 ACM程序设计竞赛 我不是股神
  18. 十五、陈述句_高频扩充
  19. elementUI的tree组件搜索过滤,可识别拼音,且不区分大小写
  20. 英文学习20180621

热门文章

  1. Java知多少(96)绘图之设置字型和颜色
  2. http://4526621.blog.51cto.com/4516621/1343369
  3. Windows Server 2008 R2 负载平衡入门篇
  4. [Python图像处理] 二十七.OpenGL入门及绘制基本图形(一)
  5. [Python爬虫] 在Windows下安装PhantomJS和CasperJS及入门介绍(上)
  6. 【数据结构与算法】之深入解析“随机翻转矩阵”的求解思路与算法示例
  7. SwiftUI之深入解析属性包装器如何处理结构体
  8. 自动驾驶的一些专业术语
  9. Python3实现旋转数组的3种算法
  10. CentOS curses 中文乱码问题