为什么我不能使用列表迭代器逻辑比较运算符?

why can't i use list iterator logical comparisons operator?

本文关键字:比较 运算符 迭代器 列表 不能 为什么      更新时间:2023-10-16

这是非常基本的,但我在这里找不到类似的问题。我试图使用列表从不同的方向迭代相同排序的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...
}

错误当然是

没有匹配的操作数

100%可能我错过了一些基本的东西

只有随机访问迭代器是有序的。std::list迭代器仅为双向迭代器,因此不支持operator<operator>

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

while (itSmallFamily != itLargeFamily)

你必须确保迭代器不会相互跳过,这样才能正常工作。也就是说,如果itSmallFamilyitLargeFamily只有一个增量的距离,你只需要把它们交换一下,它们就永远不会相等了。

可以使用std::vector,它的迭代器是随机访问迭代器。另外,std::arraystd::deque也支持随机访问。

从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. 由于列表已排序,因此可以比较迭代器所指向的元素,而不是迭代器本身。