gpt4 book ai didi

c++ - 为什么在声明 std::set 时需要重复排序子例程?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:31:36 27 4
gpt4 key购买 nike

在我的 C++ 程序中,我试图按值而不是键对我的 map 进行排序。

来自 this question ,很明显,这样做的方法是创建一个集合,其元素是成对的,并且由我自己的小于函数排序。

这是我尝试执行此操作的一些示例代码:

#include <map>
#include <set>
#include <iostream>
#include <string>

using namespace std;

bool compareCounts(const pair<string, size_t> &lhs, const pair<string, size_t> &rhs);

int main (int argc, char *argv[]) {
map <string, size_t> counter = { {"A", 1}, {"B", 2}, {"C", 3} };
set <pair<string, size_t>, decltype(compareCounts) *> sorted_counter;
for (map<string, size_t>::iterator it = counter.begin(); it != counter.end(); ++it) {
cout << "About to add: " << it->first << ":" << it->second << endl;
auto ret = sorted_counter.insert(*it);
if (! ret.second) {
cout << "ERROR adding this element!" << endl;
} else {
cout << "Element added ok" << endl;
}
cout << "Set is of size: " << sorted_counter.size() << endl;
}

return 0;
}

bool compareCounts(const pair<string, size_t> &lhs, const pair<string, size_t> &rhs) {
return lhs.second > rhs.second;
}

这是输出:

About to add: A:1
Element added ok
Set is of size: 1
About to add: B:2
Segmentation fault: 11

我注意到当我去添加第二个元素时事情会崩溃。我发现发生这种情况是因为现在有必要调用我的排序子例程 compareCounts

修复是更改此行:

set <pair<string, size_t>, decltype(compareCounts) *> sorted_counter;

为此:

set <pair<string, size_t>, decltype(compareCounts) *> sorted_counter(compareCounts);

为什么我需要指定排序子程序 compareCounts 两次?编译器不是已经从我的类型定义中知道了吗?

最佳答案

set <pair<string, size_t>, decltype(compareCounts) *> sorted_counter;

您从未指定 set 实际应该使用什么比较器。将上面一行改为

set <pair<string, size_t>, decltype(compareCounts) *> sorted_counter(compareCounts);

如果没有指定比较器,set 默认构造一个 (nullptr),当它尝试使用比较器插入第二个元素时,您的代码会崩溃。

你应该只使用仿函数而不是函数指针

struct compareCounts
{
bool operator()(const pair<string, size_t> &lhs,
const pair<string, size_t> &rhs) const
{
return lhs.second > rhs.second;
}
};

set <pair<string, size_t>, compareCounts> sorted_counter;

关于c++ - 为什么在声明 std::set 时需要重复排序子例程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18390076/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com