我正在编写一个c ++程序,用于计算给定文件中不同字符串的出现次数。我使用std :: sort按第二个字段(int)的降序对其进行排序。
...
bool compare(const std::pair<std::string, int> &p1, const std::pair<std::string, int> &p2) {
if (p1.second < p2.second) return false;
return true;
}
TC::TC(const std::vector<std::string> &collection) {
...
// iterating through collection with iterator "it", and push_back a pair when unique string found
std::pair<std::string, int> temp = {*it, std::count(collection.begin(), collection.end(), *it)};
counts.push_back(temp);
// calling std::sort to sort descending order of the field "second"
std::sort(counts.begin(), counts.end(), &compare);
然而,当我测试一个示例文件(我可以作为参数传递给main)时,我得到了段错误。并且,从查看gdb,以下显示:
47 if (p1.second < p2.second) {
(gdb) p p1
$14 = (const std::pair<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, int> &) @0x61c520: {first = "namespace", second = 1}
...
(gdb) p p1
$16 = (const std::pair<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, int> &) @0x61c500: {first = {static npos = <optimized out>,
_M_dataplus = {<std::allocator<char>> = {<__gnu_cxx::new_allocator<char>> = {<No data fields>}, <No data fields>}, _M_p = 0x61ec88 "sep"}}, second = 1}
在我看来,如果我正确地解释“&lt; __ gnu_css ..... _M_p”,那么一些对的“第一”字段超出范围并变成垃圾。但是,我很困惑,为什么会发生这种情况,因为push_back将创建一对新字符串和int的新副本。所以它不应该是垃圾。这是我的第一篇文章,我仍然是c ++的新手,所以如果有什么东西看起来不清楚,请告诉我。
答案 0 :(得分:2)
compare
以某种方式搞砸了,不符合Compare
的要求。丢掉分支,只需:
return p1.second > p2.second;
按降序排序。您拥有的内容基本上是>=
,违反了:
- 适用于所有
a
,comp(a,a)==false
- 如果
comp(a,b)==true
则comp(b,a)==false
这会导致未定义的行为。