比较迭代器,C++

16

是否可以比较两个迭代器?使用std::min进行比较。

void change ( typename TList <Item *>::Type ::iterator it_begin, typename TList <Item*>::Type ::iterator it_end )
{
   ....
this->items.resize ( index );
   std::sort ( it_begin, std::min (it_end, it_begin += index - 1); //Compare two iterators, exception
....
}

抛出以下异常:

Assertion failed: Vector iterators  incompatible... 

还有其他比较的方法吗?


TList<Item *>::Typethis->items 的类型是什么?这些迭代器指向 this->items 吗? - Mooing Duck
4个回答

26

可以。但我怀疑你是否能用 std::min 完成这个任务。

你可以使用 std::distance 函数计算两个迭代器之间的距离,然后使用该距离确定哪个迭代器更小。一旦你知道了较小的迭代器,就可以将其传递给 std::sort 函数。

这里是一个简单的例子来说明如何计算距离:

#include <iostream>
#include <iterator>
#include <vector>

int main() {
    std::vector<int> v(100); //vector of size 100
    std::cout <<(std::distance(v.begin(), v.begin() + 10))<< std::endl;
    std::cout <<(std::distance(v.begin() +25, v.begin() +10))<< std::endl;
}

输出:

10
-15
希望这足以让你知道如何继续做你想做的事情。

7
“然后您可以使用距离确定哪个迭代器更小。” 不正确。 “如果通过(可能是重复)递增第一个无法到达最后一个,则行为未定义。” - Mooing Duck
我认为只有在迭代器实际上是随机访问迭代器时,您才会想要这样做。因为它们是支持比较操作的迭代器。 - Aleksei Fedotov
3
牛叫鸭:在C++11之前,如果InputIt是RandomAccessIterator,则当last无法从first到达且first无法从last到达时,其行为未定义。 - xofon
如果迭代器(作为参数传递)是随机访问迭代器,则为O(1),否则为O(n)。 - Nawaz
1
@KartikRaj:有许多种迭代器。请看这个链接:https://dev59.com/d2435IYBdhLWcg3wyzQJ 。例如,像指针一样行为的迭代器是随机访问迭代器,因为您可以使用偏移量访问随机元素,即 *(it + offset)。如果是InputIteratorForwardIterator,则无法执行相同操作。 - Nawaz
显示剩余2条评论

5

在《C++ Primer 第五版》的第111页3.4.2节"迭代器算术"中写道:

我们可以使用==和!=来比较库容器内的有效迭代器。

该节还告诉我们,字符串和向量的迭代器支持关系运算符(也称为迭代器算术),包括 >、>=、<和<=。


3

调用resize后,您现有的所有迭代器都无效。

此外,这行代码会导致未定义的行为,因为您正在以不确定的顺序更改it_begin并从中读取。


3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接