【发布时间】:2016-01-29 10:09:30
【问题描述】:
为什么const_iterator 不提供const_iterator::base() 函数,而像reverse_iterator 那样获取对应的非常量iterator 呢?
考虑以下伪代码(例如几何算法):
std::container< point > universe;
auto it = std::cbegin(universe);
std::list< decltype(it) > interesting_subset = sieve(it, std::cend(universe));
auto structure = algorithm(interesting_subset);
其中universe 是所有输入点。在sieve()-ing 之后,interesting_subset 包含指向universe 成员子集的迭代器。在algorithm() 之后从interesting_subset 构造一个结果structure,其中包含对universe 成员的引用(迭代器)。
最后,我想将points 更改为结果structure(例如,移动它们)。但同样我想在algorithm 操作期间保护他们免受修改,因此我使用std::cbegin/std::cend 与std::begin/std::end 相反。最后我只有const_iterator 对源points 的引用。
这是 iterator std::container< T >::const_iterator::base() const 成员函数的一个非常用例,我希望将其呈现到 STL 容器中。
【问题讨论】:
-
如果底层容器是
const怎么办? -
@molbdnilo :) 有趣的问题。也许运行时错误(抛出异常)?或者可能应该有两个版本的
const_iterator(比如说,当前应该替换为really_const_iterator=)。 -
@molbdnilo 也许
std::cbegin(non_const_container)应该返回具有成员函数base()的const_iterator的增强版本。 -
如果
container支持随机访问迭代器,您可以使用auto offset = it - cbegin(universe); auto new_it = begin(universe) + offset;轻松地将it转换为非常量版本。如果不是随机访问,效率会低。 -
@BoPersson 是的。同样对于任何其他容器(如果它由完全不同的元素组成),我可以通过
std::addressof(*cit) == std::addressof(*it)比较找到对应的元素。但它会导致额外的二次复杂度步骤来找到所有对应的元素。
标签: c++ stl iterator containers const-iterator