STL对嵌套类进行排序

时间:2011-09-26 19:00:18

标签: c++ stl graph operator-overloading

我有一个图表类,它有一个节点向量。在每个节点中,都有一个顶点和一个STL边列表。基本上它是一个邻接列表。

对于我的作业,我试图显示边缘最多的顶点。我想我会按边缘大小对图形的节点矢量进行排序,并打印前N个顶点。

所以我试图找出STL排序,但我遇到了困难。

我有

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

其中path是节点的向量(node =顶点值和边缘列表)

在我的节点类中,我有

bool operator<(const Node<T>& rhs){
    return size < rhs.size; //size is how many edges the vertex has
}

但它给了我错误。如何在节点类中构造operator<函数以使用STL排序?

以下是错误:

$ make
g++ -c -g -std=c++0x graphBuilder.cpp
In file included from /usr/lib/gcc/i486-slackware-linux/4.5.2/../../../../include/c++/4.5.2/algorithm:63:0,
             from graph.h:6,
             from graphBuilder.cpp:2:
/usr/lib/gcc/i486-slackware-linux/4.5.2/../../../../include/c++/4.5.2/bits/stl_algo.h: In function '_RandomAccessIterator std::__unguarded_partition(_RandomAccessIterator, _RandomAccessIterator, const _Tp&) [with _RandomAccessIterator = __gnu_cxx::__normal_iterator<Node<std::basic_string<char> >*, std::vector<Node<std::basic_string<char> >, std::allocator<Node<std::basic_string<char> > > > >, _Tp = Node<std::basic_string<char> >]':
/usr/lib/gcc/i486-slackware-linux/4.5.2/../../../../include/c++/4.5.2/bits/stl_algo.h:2249:70:   instantiated from '_RandomAccessIterator std::__unguarded_partition_pivot(_RandomAccessIterator, _RandomAccessIterator) [with _RandomAccessIterator = __gnu_cxx::__normal_iterator<Node<std::basic_string<char> >*, std::vector<Node<std::basic_string<char> >, std::allocator<Node<std::basic_string<char> > > > >]'
/usr/lib/gcc/i486-slackware-linux/4.5.2/../../../../include/c++/4.5.2/bits/stl_algo.h:2280:54:   instantiated from 'void std::__introsort_loop(_RandomAccessIterator, _RandomAccessIterator, _Size) [with _RandomAccessIterator = __gnu_cxx::__normal_iterator<Node<std::basic_string<char> >*, std::vector<Node<std::basic_string<char> >, std::allocator<Node<std::basic_string<char> > > > >, _Size = int]'
/usr/lib/gcc/i486-slackware-linux/4.5.2/../../../../include/c++/4.5.2/bits/stl_algo.h:5212:4:   instantiated from 'void std::sort(_RAIter, _RAIter) [with _RAIter = __gnu_cxx::__normal_iterator<Node<std::basic_string<char> >*, std::vector<Node<std::basic_string<char> >, std::allocator<Node<std::basic_string<char> > > > >]'
graph.h:32:13:   instantiated from 'void Graph<T>::topN(int) [with T = std::basic_string<char>]'
graphBuilder.cpp:10:17:   instantiated from here /usr/lib/gcc/i486-slackware-linux/4.5.2/../../../../include/c++/4.5.2/bits/stl_algo.h:2211:4: error: passing 'const Node<std::basic_string<char> >' as 'this' argument of 'bool Node<T>::operator<(const Node<T>&) [with T = std::basic_string<char>]' discards qualifiers
make: *** [graphBuilder.o] Error 1

2 个答案:

答案 0 :(得分:3)

您的会员功能需要const - 合格:

bool operator<(const Node<T>& rhs) const{

修改

根据请求,我还知道你需要如何制作成员函数const

在stdlib相关的编译器错误中划分隐藏的含义是一门艺术,你可以通过练习获得更好的东西。与Stdlib相关的错误通常会发出一系列编译器错误。通常这些错误中最有用的是最后一个错误,因为那个错误是从您实际编写的代码的上下文生成的,而不是来自库代码的内容。

在这种情况下,最后一个编译器错误是:

  

graphBuilder.cpp:10:17:从这里实例化   /usr/lib/gcc/i486-slackware-linux/4.5.2/../../../../include/c++/4.5.2/bits/stl_algo.h:2211:4:   错误:传递'const Node &gt;' 为'this'   参数'bool Node :: operator&lt;(const Node&amp;)[with T =   std :: basic_string]'丢弃限定符

我突出了亮点。这告诉我在OP的实际代码中,由于代码的构造方式(可能sort调用本身在const成员函数中?谁知道......)this指针必须是const,但正如我们在operator<的已发布声明中所看到的,该方法不是const。编译器错误中引用的“限定符”是标准称为“cv-qualifiers”的内容。 “cv”代表“const / volatile”。

当编译器说“将const X作为this传递给Node::operator<丢弃限定词”时,它真正想说的是:

“你说X是const但是你试图通过const X调用一个非const成员函数。为了让我进行这个调用,我必须 discard < / em> X上的const限定符。我不允许这样做,所以你必须修复你的代码。“

这里“丢弃”的限定符是方法本身的限定符。换句话说,operator<必须是const成员函数,但它不是。

答案 1 :(得分:1)

bool operator<(const Node<T>& rhs) const {
    return size() < rhs.size();
}

使操作符const正确应该可能有助于不激怒编译器。

注意:问题出现是因为this始终是const所以编译器希望您承诺不要通过使用this使const方法使<template typename T> struct CompareNodes { bool operator()(const Node<T>& lhs, const Node<T>& rhs) const { return lhs.size() < rhs.size(); } }; std::sort(path.cbegin(), path.cend(), CompareNodes<T>()); 更改您指定的方法。 1}}限定符。

或者,您可以进行非成员比较,以便使用类似的排序:

{{1}}