在vector <pair <string,int =“”>&gt;

时间:2015-12-03 15:06:41

标签: c++ c++11 stl gdb

我正在编写一个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 ++的新手,所以如果有什么东西看起来不清楚,请告诉我。

1 个答案:

答案 0 :(得分:2)

compare以某种方式搞砸了,不符合Compare的要求。丢掉分支,只需:

return p1.second > p2.second;

按降序排序。您拥有的内容基本上是>=,违反了:

  
      
  • 适用于所有acomp(a,a)==false
  •   
  • 如果comp(a,b)==truecomp(b,a)==false
  •   

这会导致未定义的行为。