随后迭代多个标准容器
iterator over multiple std containers subsequently
我有以下 class(显然还没有按预期工作):
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()
?
基本上,您需要定义一些自定义迭代器,在内部检查第一个范围的末尾,然后继续到下一个范围。
不过,这种事情经常发生。最终你会问为什么迭代器用于 two vectors,为什么迭代器用于两个 vectors,为什么序列具有相同的容器类型,等等在。 Nir Tzachar 和我写了一个 C++ port of Python itertools 来做这种常见的事情。在这种情况下,您只需使用
chain(firstVector, secondVector)
可以从this bitbucket repo下载。
您可以编写自己的函数来进行递增:
std::vector<int>::iterator& inc(std::vector<int>::iterator& it) {
++it;
if (it == firstVector.end())
it = secondVector.begin();
return it;
}
这也很好地向其他人表明增量不会正常发生。
没有什么能阻止你自己动手。甚至可以让它随机访问!
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;
}
我将把其余的操作留作练习。
我有以下 class(显然还没有按预期工作):
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()
?
基本上,您需要定义一些自定义迭代器,在内部检查第一个范围的末尾,然后继续到下一个范围。
不过,这种事情经常发生。最终你会问为什么迭代器用于 two vectors,为什么迭代器用于两个 vectors,为什么序列具有相同的容器类型,等等在。 Nir Tzachar 和我写了一个 C++ port of Python itertools 来做这种常见的事情。在这种情况下,您只需使用
chain(firstVector, secondVector)
可以从this bitbucket repo下载。
您可以编写自己的函数来进行递增:
std::vector<int>::iterator& inc(std::vector<int>::iterator& it) {
++it;
if (it == firstVector.end())
it = secondVector.begin();
return it;
}
这也很好地向其他人表明增量不会正常发生。
没有什么能阻止你自己动手。甚至可以让它随机访问!
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;
}
我将把其余的操作留作练习。