我正在编写一个包含事物 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/