1

这是非常基本的,但我在这里找不到类似的问题。我正在尝试使用 list 从不同方向迭代相同的排序 STL 列表。我知道我可以将迭代器与list.begin()and进行比较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% 的机会我错过了一些基本的东西。

4

2 回答 2

4

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

相反,您可以与!=.

while (itSmallFamily != itLargeFamily)

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

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

于 2013-04-08T09:56:49.113 回答
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. 由于您的列表已排序,因此您可以比较迭代器指向的元素,而不是迭代器本身。

于 2013-04-08T10:08:36.367 回答