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);
会永远吗?
答案 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)不习惯 构建这些价值观。