我有一个由 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() 迭代器是自找麻烦,例如如果 vector 没有元素,那么它将是未定义的。即使我知道它永远不会是空的,它仍然看起来很丑。我在想也许 rbegin() 是要走的路,但不确定将正向迭代器与反向迭代器进行比较的最佳方法。
最佳答案
这样做:
// defined in boost/utility.hpp, by the way
template <typename Iter>
Iter next(Iter iter)
{
return ++iter;
}
// first check we aren't going to kill ourselves
// then check if the iterator after itr is the end
if ((itr != Mine.end()) && (next(itr) == Mine.end()))
{
// points at the last element
}
就是这样。永远不会给你未定义的行为,适用于所有迭代器,美好的一天。
为了好玩而总结一下:
template <typename Iter, typename Cont>
bool is_last(Iter iter, const Cont& cont)
{
return (iter != cont.end()) && (next(iter) == cont.end())
}
给予:
if (is_last(itr, Mine))
如果您对实用功能/好看的代码过敏,请执行以下操作:
if ((itr != Mine.end()) && (itr + 1 == Mine.end()))
但是你不能在非随机访问迭代器上这样做。这个适用于双向迭代器:
if ((itr != Mine.end()) && (itr == --Mine.end()))
并且是安全的,因为 end() > itr
通过第一次检查。
关于c++ - 测试迭代器是否指向最后一项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3516196/