如何解决这个 C++ 向量排序错误?

Posted

技术标签:

【中文标题】如何解决这个 C++ 向量排序错误?【英文标题】:How do I defeat this C++ Vector Sorting error? 【发布时间】:2012-01-19 05:23:20 【问题描述】:

这是我试图编译的问题代码:

bool TeamMatcher::simpleComparator(Student first, Student second)
  return (first.numberOfHrsAvailable < second.numberOfHrsAvailable);


void TeamMatcher::sortRosters()
  sort(rosterExcellent.begin(), rosterExcellent.end(), simpleComparator);
  sort(rosterGood.begin(), rosterGood.end(), simpleComparator);
  sort(rosterOK.begin(), rosterOK.end(), simpleComparator);
  sort(rosterPoor.begin(), rosterPoor.end(), simpleComparator);
  sort(rosterNoSay.begin(), rosterNoSay.end(), simpleComparator);

然后这是我得到的错误:

TeamMatcher.C: In member function ‘void TeamMatcher::sortRosters()’:
TeamMatcher.C:51: error: no matching function for call to ‘sort(__gnu_cxx::__normal_iterator<Student*, std::vector<Student, std::allocator<Student> > >, __gnu_cxx::__normal_iterator<Student*, std::vector<Student, std::allocator<Student> > >, <unresolved overloaded function type>)’
/usr/include/c++/4.2.1/bits/stl_algo.h:2852: note: candidates are: void std::sort(_RandomAccessIterator, _RandomAccessIterator, _Compare) [with _RandomAccessIterator = __gnu_cxx::__normal_iterator<Student*, std::vector<Student, std::allocator<Student> > >, _Compare = bool (TeamMatcher::*)(Student, Student)]

它对剩余的四种排序重复此错误。我不明白,我基本上是从这里复制/粘贴这个解决方案:http://www.cplusplus.com/reference/algorithm/sort/

任何帮助将不胜感激!

【问题讨论】:

您是否将 using namespace 指令 using namespace std; 添加到您的文件中,如果没有,您需要将 std 命名空间的算法名称质量为 std::sort 我做到了,至少在我导入到这个 .C 文件的 .h 文件中。那还是不错的吧? @Als - 您可以从编译器输出中看到它已经将 std::sort 视为候选对象,这意味着这不是问题。 这不是问题,但也不是很好,不要在头文件中添加 using 指令 这是一种不好的做法。它将该命名空间中的所有符号导入到包含标题的翻译单元中。这会导致符号名称污染,相信我std 命名空间有很多你不需要的东西。另外,这可能会导致编译时间更长.在源 cpp 文件中使用 using 声明 @tzaman:我在 Joachim 编辑 Q 以使错误可读之前发布了评论。这是第一次预感没有看到不可读的错误消息。这有时被称为 心理调试 的问题。另外,由于这只是一个猜测,我将其发布为评论而不是回答。 【参考方案1】:

您需要将您的simpleComparator 声明为static 方法,否则它将不符合std::sort 所期望的类型。

为了完全正确,您还应该将其传递为TeamMatcher::simpleComparator,有关详细信息,请参阅here。

【讨论】:

啊哈!非常感谢你!这解决了它!人生的制胜之道【参考方案2】:

试试这个代替你的比较功能:

bool simpleComparator(const Student& first, const Student& second)
    return (first.numberOfHrsAvailable < second.numberOfHrsAvailable);

请注意,比较函数不是 TeamMember 类的成员,传入 const 引用可防止不必要的复制。

您可以更进一步,为学生定义一种比较方法

bool Student::operator<(const Student& first, const Student& second)

    return (first.numberOfHrsAvailable < second.numberOfHrsAvailable);

现在你可以对你的学生调用 sort ,它会有一个比较方法可以使用:

std::sort(studentIter.begin(), studentIter.end());

但是在这种情况下,我建议使用第一种方法,除非您总是想按可用小时数来比较学生。例如,这可能会让其他程序员感到困惑:

if ( studentA < studentB )

    // Do stuff

这可能会令人困惑,因为您将如何比较两个学生(GPA、出勤率、可用小时数、身高、智商等等...)并不明显。

【讨论】:

以上是关于如何解决这个 C++ 向量排序错误?的主要内容,如果未能解决你的问题,请参考以下文章

分段错误:在 C++ 中弹出向量时出现 11

如何在 C++ 中对向量组元素进行排序?

对向量进行冒泡排序的 C++ 长度错误

我如何按类属性对C++向量数组进行排序[重复]

c++中字符串向量的索引[关闭]

向量的 C++ 分段错误