C++ 迭代器如何实现 next() 和 previous() 函数
C++ iterators how to implement next() and previous() functions
我正在编写一个包含事物向量的实用程序 class。我想向调用者 classes 提供访问器导航功能。例如,
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() 不是特别满意。
- 在这种情况下,调用方如何检测迭代结束?调用者无权访问向量,因此无法调用 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;
}
我正在编写一个包含事物向量的实用程序 class。我想向调用者 classes 提供访问器导航功能。例如,
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() 不是特别满意。
- 在这种情况下,调用方如何检测迭代结束?调用者无权访问向量,因此无法调用 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;
}