【发布时间】:2011-03-31 18:43:27
【问题描述】:
我有一个由 std::find() 产生的 stl 迭代器,并希望测试它是否是最后一个元素。一种写法如下:
mine *match = someValue;
vector<mine *> Mine(someContent);
vector<mine *>::iterator itr = std::find(Mine.begin(), Mine.end(), match);
if (itr == --Mine.end()) {
doSomething;
}
但在我看来,递减 end() 迭代器是自找麻烦,例如如果向量没有元素,那么它将是未定义的。即使我知道它永远不会是空的,它仍然看起来很丑。我在想也许 rbegin() 是要走的路,但不确定将正向迭代器与反向迭代器进行比较的最佳方法。
【问题讨论】:
-
这里确实有些难看。但是,我建议这不是您确定
itr是否指向最后一个元素的方式。丑陋的是你需要知道itr是否指向最后一个元素。 -
@John:你可能是对的。也许使用
if (Mine.Length() != 0 && &Mine[Mine.Length()-1] == itr)或类似的东西来检查会更有意义。 -
嗯,我的回答也很丑。这应该是 GMan 的第一个建议:
if (&Mine.back() == itr)。 -
@Steven:我敢打赌,如果我们知道这段代码的更大上下文,我们就能找出真正的问题并修复它。我有一个理论。如果代码拒绝被编写,那是因为它知道它是错误的。
-
@John:同样,你可能是对的。很多时候,有些事情很尴尬,因为它与更自然的做事方式作斗争。