c++ - 测试迭代器是否指向最后一项?

标签 c++ stl iterator

我有一个由 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/

相关文章:

c++ - 8难题:对STL堆/优先级队列进行排序,其中包含按成员变量指向对象的指针

c++ - 将模板函数传递给 std::for_each

c++ - openGL 和 vector

java - 我正在尝试实现我自己的 HashSet,但我不知道 iterator() 方法应该返回什么?

c++ - 为什么在 __assume 中使用函数调用时 MSVC 不报错?

c++ - 数组操作的复杂性

c++ - 在类本身中存储类的对象

java - Java 迭代器的奇怪行为

javascript - 是否存在与 Python 的 for 循环等效的 JavaScript?

c++ - 关键字 "value"是什么意思?