【发布时间】:2017-02-23 19:51:05
【问题描述】:
我正在编写一个代码,它使用迭代器上的简单算术将向量分成相等的部分。我的逻辑可能不是很好(尽管我相当确定这是正确的),这可能意味着我在 end() 之后创建了一个无效的迭代器:
//selectWords is a vector<string>
//No is an unsigned integer.
unsigned wordNo = selectWords.size()/No;
unsigned remainder = selectWords.size()%No;
for(auto i = 0; i < No; ++i){
unsigned extra = remainder ? 1 : 0;
auto b = selectedWords.begin()+(i*wordNo);
auto e = selectedWords.begin() + ((i+1)*wordNo) + extra;
if(e > selectedWords.end()) throw logic_error("Iterator e in GridList::createGrids goes past the end of selectWords.") //shouldn't happen unless I've made a mistake.
...
//do stuff
...
if(remainder > 0) --remainder;
}
我很好奇的部分是e > selectedWords.end()。如果e 已经超过end(),那么它是一个无效的迭代器,我不确定是否可以保证比较运算符提供定义的行为。事实上,看看 Ben Voigt 在this thread 和 N3337 的 24.2.7 中的帖子,很明显,使用迭代器算术创建一个 past-the-end() 迭代器是没有意义的或非法的。然而,检查迭代器是否超过 end() 的能力要求对 past-the-end() 迭代器的操作提供定义的行为。
如果做这个比较无效,有没有其他办法?还是我只需要在编译之前绝对确定我的逻辑是正确的?
【问题讨论】:
-
如果你的迭代器结束了,你给它加一个;实现可以返回 end() - 这意味着您对 iterator > end 的测试将始终为 false。
-
您可以改为测试
((i + 1) * wordNo) + extra > selectedWords.size()。