标准::地图使用.这是怎么回事?核心转储?我做得不正确?

std::map use. What is wrong here ? core dump ? What I do not do correctly?

本文关键字:转储 核心 不正确 怎么回事 地图 标准      更新时间:2023-10-16

这里有什么问题? 核心转储 ?我做得不正确?

#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;
//...
}

或者,如果您只需要使用以floats 作为键的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;
}