我一直以为“奇异”迭代器是已默认初始化的迭代器,它们可以用作类似的前哨值:

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;
   }
}

但是this answer不仅暗示我对“单数”的定义是错误的,而且我以上的比较完全是非法的。

是吗?

最佳答案

显然,这将对某些迭代器有效-T*是一个清晰的示例-但绝对不能保证所有迭代器都具有正确的行为。 C++ 11 24.2.1 [iterator.requirements.general] p5:



您可以使用简单的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;
   }
}

10-08 09:24
查看更多