标准::地图使用.这是怎么回事?核心转储?我做得不正确?
std::map use. What is wrong here ? core dump ? What I do not do correctly?
这里有什么问题? 核心转储 ?我做得不正确?
#include <cstdio>
#include <map>
#include <cmath>
#include <cstring>
#include <iostream>
bool compFloats (const float f1, const float f2){
return floor (f1) < floor (f2);
};
int main (int argc, char **argv){
std::map < float, char, decltype (&compFloats) > m;
m.emplace (3.9, 'a');
m.emplace (3.1, 'b');
m.emplace (4.1, 'c');
m.emplace (4.5, 'd');
m.emplace (5.2, 'e');
for (auto i = m.begin (); i != m.end (); i++)
printf ("%c ", i->second);
printf ("n");
printf ("hello worldn");
return 0;
}
首先假设自定义生成的比较运算符是此代码正常运行所必需的,您面临的问题是传递给地图模板的参数decltype (&compFloats)
并不描述要用作比较器的特定函数,而是描述该函数的类型名。因此,当映射尝试执行比较时,它没有任何可用的具体函数,并且可能会在某处取消引用空指针,从而导致核心转储。
如果您确实需要这种比较(其中浮点值在保存之前向下舍入到最接近的整数),则需要使用可以一起比较float
的本地struct
来定义映射:
struct CompFloat {
bool operator()(float a, float b) const {
return floor(a) < floor(b);
}
};
int main() {
std::map<float, char, CompFloat> m;
//...
}
或者,如果您只需要使用以float
s 作为键的std::map
,并且截断无关紧要(或不必要/无用),只需编写此内容即可。
int main() {
std::map<float, char> m;
//...
}
这将完成您可能期望的。
基于@Xirema的初步迹象,我尝试了"预期语法">
而不是:
std::map < float, char, decltype (&compFloats) > m;
我将其初始化为:
std::map<float,char,decltype(&floatComp)> m(&floatComp);
我不知道它是在文档中的哪个位置编写的,但现在按预期正常工作!!
为了更好地理解映射的类和对象之间的区别,代码通过定义两个具有相同类型但不同比较函数的映射来遵循。
#include <cstdio>
#include <map>
#include <cmath>
#include <cstring>
#include <iostream>
bool comp1(const float f1,const float f2) {return floor(f1)<floor(f2);}
bool comp2(const float f1,const float f2) {return f1-floor(f1)<f2-floor(f2);}
typedef bool (*comp_t)(const float,const float);
typedef std::map<float,char,comp_t> M;
int main(int argc, char **argv)
{
M m1(&comp1);
M m2(&comp2);
m1.emplace(3.9,'a');m2.emplace(3.9,'a');
m1.emplace(3.1,'b');m2.emplace(3.1,'b');
m1.emplace(4.1,'c');m2.emplace(4.1,'c');
m1.emplace(4.5,'d');m2.emplace(4.5,'d');
m1.emplace(5.2,'e');m2.emplace(5.2,'e');
for (auto i=m1.begin();i!=m1.end();i++)
printf("%c ",i->second);
printf("n");
for (auto i=m2.begin();i!=m2.end();i++)
printf("%c ",i->second);
printf("n");
return 0;
}
相关文章:
- 如何找出GDB的SIGTRAP核心转储的根本原因
- C++映射分割错误(核心转储)
- 在c++中初始化矩阵时出现分段错误(核心转储)
- 在c++中键入向量中的所有值后,得到分段错误(核心转储)
- 浮点异常(核心转储)#694457
- 分段错误(核心转储)但无法弄清楚
- 链接到libkcapi时没有核心转储
- 检测到堆栈粉碎:已终止 中止(核心已转储)
- 分段错误(核心转储) - 使用 SavedModel 的 Tensorflow C++ API 进行推断
- 我不知道为什么这段代码会让核心被转储?
- 在基数排序中,我得到 munmap_chunk():无效指针和中止(核心转储).为什么?
- 访问std::list元素将转储核心
- 使用SIGSEGV或SIGABRT信号转储核心并终止进程
- Eclipse (C++) 崩溃 无法写入核心转储.核心转储已被禁用
- 已终止(转储核心)
- 转储核心时拍摄堆快照的时间
- 读取字符串时转储核心
- 当main函数返回时转储核心
- 是否可以转储核心但不退出进程
- 在尝试libssh身份验证时转储核心