为什么我不能使用list iterator逻辑比较运算符?

时间:2013-04-08 09:55:03

标签: c++ list stl iterator

这是非常基本的,但我在这里找不到类似的问题。我试图使用列表从不同的方向迭代相同的排序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%的可能性我错过了一些基本的东西。

2 个答案:

答案 0 :(得分:3)

仅订购随机访问迭代器。 std::list迭代器只是双向迭代器,因此它们不支持operator<operator>

相反,您可以与!=进行比较。

while (itSmallFamily != itLargeFamily)

您必须确保迭代器不会相互跳过,以使其工作。也就是说,如果itSmallFamily距离itLargeFamily只有一个增量,那么您只需将它们交换掉,它们就永远不会相等。

您可以改为使用std::vector,其迭代器是随机访问迭代器。此外,std::arraystd::deque也支持随机访问。

答案 1 :(得分:1)

从sftrabbit的注释和答案中可以看出,关系运算符仅为随机访问迭代器定义,std::list只有双向迭代器。因此,有几种解决方案可以解决您的问题:

  1. 使用std::vectorstd::array。它们提供随机访问迭代器,对于较小的大小具有更好的性能,并且取决于您如何填充/使用它们以用于更大的尺寸,并且它们具有更好的内存占用。这是首选的解决方案,我称之为“默认”解决方案。仅当存在非常好的,可测量的原因时才使用其他容器(例如,分析器告诉您使用该容器是性能瓶颈)。
  2. 由于您知道列表的大小,因此可以使用计数器进行迭代:

    for (size_t i = 0, count = families.size()/2; 
         i < count; 
         ++i, --itSmallFamily, ++itLargeFamily)
    { /* do stuff */ }
    
  3. 由于列表已排序,您可以比较迭代器指向的元素而不是迭代器本身。