bkx*_*kxp 5 c++ containers iterator stl vector
最近,我不得不用一组类似的容器替换单个容器。因此,我需要一个保留原始迭代器语义的组合迭代器。我遇到的问题是处理组合的 end() 位置。由于无法比较未分配的迭代器,我不得不将所有四个迭代器都包含为成员(即两个范围,外部和内部)。这导致 operator==() 在最常见的情况下需要三个比较。当然,这比普通嵌套循环中的比较(在最常见的情况下需要单个比较)要糟糕得多。除此之外,我注意到四个迭代器代码容易出错,因为如果容器内容在循环内发生变化,将 end() 迭代器保留在组合迭代器中可能会导致跳过 for() 循环的退出条件。
template <class T>
class MyContainer
{
typedef std::vector<T> Inner;
typedef std::vector<Inner> Outer;
Outer v_;
public:
class iterator
{
friend class MyContainer;
Outer::iterator it1_, it1end_;
Inner::iterator it2_, it2end_;
iterator(Outer::iterator it1, Outer::iterator it1end) :
it1_(it1), it1end_(it1end)
{
if(it1_!=it1end_) {
it2_ = it1_->begin();
it2end_ = it1_->end();
}
}
public:
bool operator==(iterator it) const {
return it1_==it.it1_ &&
(it1_==it1end_ || it2_==it.it2_);
}
};
iterator begin() { return iterator(v_.begin(), v_.end()); }
iterator end() { return iterator(v_.end(), v_.end()); }
};
Run Code Online (Sandbox Code Playgroud)
考虑到这些因素,有没有一种方法可以实现嵌套迭代器语义,而无需存储两个 end() 值或无需在 operator==() 中进行三个比较?
| 归档时间: |
|
| 查看次数: |
1592 次 |
| 最近记录: |