这是一个奇异迭代器吗?如果是,我能否将它与另一个进行比较?

Is this a singular iterator and, if so, can I compare it to another one?

本文关键字:比较 另一个 如果 一个 迭代器      更新时间:2023-10-16

我一直认为"单数"迭代器是默认初始化的迭代器,它们可以作为可比较的哨兵值,排序为:

typedef std::vector<Elem>::iterator I;
I start = I();
std::vector<Elem> container = foo();
for (I it = container.begin(), end = container.end(); it != end; ++it) {
   if ((start == I()) && bar(it)) {
      // Does something only the first time bar(it) is satisfied
      // ...
      start = it;
   }
}

但是这个答案不仅表明我对"单数"的定义是错误的,而且表明我上面的比较是完全不合法的。

?

显然这对一些迭代器有效——T*就是一个明显的例子——但这绝对不能保证对所有迭代器都有正确的行为。c++ 11 24.2.1 [iterator.requirements.]一般]p5:

奇异值不与任何序列相关联…对于奇异值,大多数表达式的结果是未定义的;唯一的异常会破坏保存奇异值的迭代器将非奇异值赋值给保存的迭代器的奇异值和DefaultConstructible需求,使用值初始化的迭代器作为复制或移动操作的源。

您可以使用一个简单的bool标志来复制您想要的行为:

std::vector<Elem> container = foo();
bool did_it_already = false;
for (I it = container.begin(), end = container.end(); it != end; ++it) {
   if (!did_it_already && bar(it)) {
      // Does something only the first time bar(it) is satisfied
      // ...
      did_it_already = true;
   }
}
相关文章: