这是非常基本的,但我在这里找不到类似的问题。我试图使用列表从不同的方向迭代相同的排序STL列表。我知道我可以将迭代器与list.begin()
和list.end()
进行比较,为什么这不起作用?
list<family>::iterator itLargeFamily =
families.begin(); //starts from the biggest families
list<family>::iterator itSmallFamily =
families.end(); //starts from the smallest families
for (; itSmallFamily > itLargeFamily; --itSmallFamily, ++itLargeFamily) {
// stuff...
}
错误当然是
没有运营商&gt;匹配这些操作数
100%的可能性我错过了一些基本的东西。
答案 0 :(得分:3)
仅订购随机访问迭代器。 std::list
迭代器只是双向迭代器,因此它们不支持operator<
或operator>
。
相反,您可以与!=
进行比较。
while (itSmallFamily != itLargeFamily)
您必须确保迭代器不会相互跳过,以使其工作。也就是说,如果itSmallFamily
距离itLargeFamily
只有一个增量,那么您只需将它们交换掉,它们就永远不会相等。
您可以改为使用std::vector
,其迭代器是随机访问迭代器。此外,std::array
和std::deque
也支持随机访问。
答案 1 :(得分:1)
从sftrabbit的注释和答案中可以看出,关系运算符仅为随机访问迭代器定义,std::list
只有双向迭代器。因此,有几种解决方案可以解决您的问题:
std::vector
或std::array
。它们提供随机访问迭代器,对于较小的大小具有更好的性能,并且取决于您如何填充/使用它们以用于更大的尺寸,并且它们具有更好的内存占用。这是首选的解决方案,我称之为“默认”解决方案。仅当存在非常好的,可测量的原因时才使用其他容器(例如,分析器告诉您使用该容器是性能瓶颈)。由于您知道列表的大小,因此可以使用计数器进行迭代:
for (size_t i = 0, count = families.size()/2;
i < count;
++i, --itSmallFamily, ++itLargeFamily)
{ /* do stuff */ }
由于列表已排序,您可以比较迭代器指向的元素而不是迭代器本身。