C++ 迭代器如何实现 next() 和 previous() 函数

标签 c++ c++11 stdvector

我正在编写一个包含事物 vector 的实用程序类。我想为调用者类提供访问器导航功能。例如,

class MyIterator {

public:
  typedef std::vector<someObj>::iterator itr;

  itr next() { return things_.begin(); }
  itr next(itr) { return std::next(itr); }

private:
  std::vector<someObj> things_;
}

这里有两个问题:

  • 这是执行此操作的正确方法,还是任何可用的简单方法?无论有没有 itr,我都不太愿意重载 next()。
  • 在这种情况下,调用方如何检测迭代结束?调用者无权访问 vector,因此无法调用 v.end()。那么,我应该为这张支票提供另一个 fn 吗?如果是这样,这看起来有点矫枉过正。

当然,我在这里遗漏了一些东西......

最佳答案

你做的不对。您真正需要导出的只是 begin() 和 end()。

#include <vector>
#include <algorithm>

struct SomeObj
{
  int i;
};

class MyVector {

public:
  using itr = std::vector<SomeObj>::iterator;
  using citr = std::vector<SomeObj>::const_iterator;

  itr begin() { return things_.begin(); }
  itr end()   { return things_.end(); }
  citr begin() const { return things_.begin(); }
  citr end() const   { return things_.end(); }

private:
  std::vector<SomeObj> things_;
};

int main()
{
    MyVector objs;
    for (auto& obj : objs)
    {
    // ....
    }

    std::for_each(objs.begin(), objs.end(), [](auto& o) { o.i = 1;});

    for (auto i = objs.begin(); i != objs.end(); ++i)
    {
       i->i = 1;
    }

    return 0;
}

关于C++ 迭代器如何实现 next() 和 previous() 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45257675/

相关文章:

c++ - 为什么 std::vector::insert 使插入点之后的所有迭代器失效

c++ - 获取 std::vector 的迭代器的更短方法

c++ - 包含未编译的 WinMain 的 Cpp 文件

c++ - 如何枚举布局内的布局?

c++ - Java 的 split() 的 c++ 等价物是什么?

c++ - 隐式转换 : is the following warning valid?

c++ - 谁能解释一下当前C++0x标准草案的这一段?

c++ - 如何创建一个 vector 作为参数

c++ - 初始化类成员的最佳方法?

c++ - std::vector 内存分配问题