我有一个图表类,它有一个节点向量。在每个节点中,都有一个顶点和一个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
答案 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}}