10

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

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

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

是吗?

4

1 回答 1

6

显然这适用于某些迭代器——T*作为一个明显的例子——但绝对不能保证所有迭代器的正确行为。C++11 24.2.1 [iterator.requirements.general] 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;
   }
}
于 2013-06-19T18:26:05.053 回答