我一直认为“奇异”迭代器是一个默认初始化的迭代器,它们可以作为类似的 sentinel 值:
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不仅表明我对“单数”的定义是错误的,而且我上面的比较完全是非法的。
是吗?答案 0 :(得分:6)
显然这适用于某些迭代器 - T*
是一个明显的例子 - 但绝对不能保证所有迭代器的正确行为。 C ++ 11 24.2.1 [iterator.requirements.general] p5:
奇异值与任何序列都没有关联...对于奇异值,大多数表达式的结果都是未定义的;唯一的 异常是破坏一个包含奇异值的迭代器 将非奇异值赋给包含a的迭代器 奇异值,对于满足该值的迭代器 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;
}
}