我有以下课程(显然还没有按预期工作):
class A
{
private:
std::vector<int> firstVector, secondVector;
public:
std::vector<int>::iterator begin(){
return firstVector.begin();
}
std::vector<int>::iterator end(){
return secondVector.end();
}
};
如何定义一个迭代器,它将遍历两个成员容器,例如:在firstVector.end()-1
secondVector.begin()
返回后,一直到secondVector.end()
?
答案 0 :(得分:4)
基本上你需要定义一些自定义迭代器,它在内部检查第一个范围的结束,然后继续下一个。
然而,这种事情发生了很多。最后你会问为什么是两个向量的迭代器,为什么是两个向量的迭代器,为什么是相同容器类型的序列,等等。 Nir Tzachar&amp;我写了一个C++ port of Python itertools来做这种常见的事情。在这种情况下,您只需使用
chain(firstVector, secondVector)
可以从this bitbucket repo下载。
答案 1 :(得分:2)
没有什么可以阻止你自己滚动。甚至可以随机访问!
struct chain_iterator
: std::iterator<std::random_access_iterator_tag, int>
{
using it = std::vector<int>::iterator;
std::pair<it, it> v1, v2;
bool first;
it cur;
};
我们保留初始迭代器对,以便我们可以正确地进行随机访问。
增量是你所期望的:
chain_iterator& operator++() {
++cur;
if (first && cur == v1.second) {
first = false;
cur = v2.first;
}
return *this;
}
取消引用是微不足道的:
int& operator*() { return *cur; }
Advance需要做一些额外的检查:
chain_iterator& operator+=(size_t n) {
if (!first) {
// trivial case
cur += n;
}
else {
size_t d = v1.second - cur;
if (d < n) {
cur += n;
}
else {
first = false;
cur = v2.first + (d - n);
}
}
return *this;
}
我将把剩下的操作留作练习。
答案 2 :(得分:-2)
您可以编写自己的函数来进行递增:
std::vector<int>::iterator& inc(std::vector<int>::iterator& it) {
++it;
if (it == firstVector.end())
it = secondVector.begin();
return it;
}
这也是对其他人的一个很好的指示,即增量不会正常发生。