【问题标题】:why can't i use list iterator logical comparisons operator?为什么我不能使用列表迭代器逻辑比较运算符?
【发布时间】:2013-03-30 08:43:02
【问题描述】:

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

错误当然是

no operator > 匹配这些操作数

100% 的机会我错过了一些基本的东西。

【问题讨论】:

  • 你想通过这种比较来达到什么目的?
  • 使用两个独立的迭代器在列表中移动。上面的 itSmallFamily-- 和 itLargeFamily++ 是为了简化示例。我需要彼此独立地推进/减少它们。

标签: c++ list stl iterator


【解决方案1】:

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

【讨论】:

  • 谢谢。对于 3. 我正在使用一个相当复杂的“families.sort(compare_size)”代码(不是很复杂,但足以在其他地方编写迭代代码。
  • @PIXP 因此它只是列表中的第 3 点 ;-) 如果比较昂贵,那不是一个选择。
  • 运行时并不昂贵,更像是笨重。评论是给未来的读者的……
【解决方案2】:

仅对随机访问迭代器进行排序。 std::list迭代器只是双向迭代器,所以不支持operator&lt;operator&gt;

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

while (itSmallFamily != itLargeFamily)

您必须确保迭代器不会相互跳过才能使其正常工作。也就是说,如果 itSmallFamilyitLargeFamily 仅相差一个增量,您只需将它们交换过来,它们就永远不会相等。

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

【讨论】:

  • 感谢您的快速回复。所以我想我没有错过什么,只是我缺乏基本知识。是否有任何迭代器(可能来自其他容器)可以像我描述的那样在容器中进行比较?
  • 这仅在(families.size() % 2) == 0 时有效,否则这些迭代器将永远不会相同。
  • @PIXP std::vector 具有随机访问迭代器。
  • @sftrabbit 与this 的“有序”定义不同吗?
  • @PIXP: std::vector 几乎总是比std::list 更好的选择。 std::list 很好,如果您在任意位置进行多次插入并且元素的数量很大(数百,甚至数千)。
猜你喜欢
  • 2017-09-24
  • 2012-07-16
  • 2015-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-17
  • 2019-03-29
  • 1970-01-01
相关资源
最近更新 更多