使用vector <bool>迭代器的任何保证?

时间:2016-08-20 15:43:05

标签: c++ vector iterator

cppreference表示vector<bool>专精的迭代器是实现定义的,许多不支持ForwardIterator等特征(因此RandomAccessIterator)。

cplusplus添加了一个神秘的&#34;大多数&#34;:

  

容器使用的指针和迭代器类型不是   尽管它们,但它们既不是指针也不是符合迭代器   应模拟他们预期的大多数行为。

我无法访问官方规范。是否为vector<bool>迭代器保证任何迭代器行为?

更具体地说,如何编写符合标准的代码以在vector<bool>的中间插入项目?以下是我尝试过的几个编译器的工作原理:

std::vector<bool> v(4);
int k = 2;
v.insert(v.begin() + k, true);

会永远吗?

2 个答案:

答案 0 :(得分:4)

vector<bool>迭代器的基本问题是它们不是ForwardIterators。 C ++ 14 [forward.iterators] / 1要求ForwardIterators的reference类型为T&const T&,视情况而定。

任何在T s范围内使用前向迭代器的函数都可以这样做:

T &t = *it;
t = //Some value.

但是,vector<bool>的{​​{1}}类型不是reference;他们是proxy object that is convertible to and assignable from a bool.他们就像bool&,但他们 bool。因此,此代码是非法的:

bool

它将尝试获取对从代理对象创建的临时值的左值引用。这是不允许的。

因此,不能在任何采用ForwardIterators或更高版本的函数中使用bool &b = *it; 的迭代器。

但是,您的代码不一定要关心它。只要您控制将vector<bool>迭代器传递给哪些代码,并且您没有做任何违反其行为的代码,那么您就可以了。

就他们的界面而言,他们的行为类似于RandomAccessIterators,除非他们没有(见上文)。因此,您可以使用具有恒定时间复杂度的整数来抵消它们等等。

vector<bool>没问题,只要您不将其视为包含vector<bool>的{​​{1}}即可。您的代码将起作用,因为它使用vector自己的接口,显然它接受了。

如果您将一对bool迭代器传递给vector<bool>,则无效。

答案 1 :(得分:3)

C ++ 14 [vector.bool] / 2:

  

除非下面描述,否则所有操作都有相同的要求和   语义作为主要vector模板,但操作除外   处理bool值类型映射到容器中的位值   存储和allocator_traits::construct(20.7.8.2)不习惯   构建这些价值观。