优先选择说,vector<bool>专门化的迭代器是定义的实现,许多迭代器不支持ForwardIterator (因此也不支持RandomAccessIterator)等特性。
cplusplus添加了一个神秘的“最”:
容器使用的指针和迭代器类型不一定既不是指针,也不一定是符合条件的迭代器,尽管它们应该模拟大多数预期的行为。
我不能进入官方的规格。对于vector<bool>迭代器是否有任何迭代器行为的保证?
更具体地说,如何编写符合标准的代码来在vector<bool>中间插入项?下面是我尝试过的几个编译器的工作原理:
std::vector<bool> v(4);
int k = 2;
v.insert(v.begin() + k, true);会一直这样吗?
发布于 2016-08-20 16:55:57
vector<bool>迭代器的基本问题是它们不是ForwardIterators. C++14转发.迭代器/1要求ForwardIterators的reference类型为T&或const T& (视情况而定)。
任何在一系列Ts上使用前向迭代器的函数都可以这样做:
T &t = *it;
t = //Some value.然而,vector<bool>的reference类型不是bool&;它们是一个。 --它们的行为像bool,但它们不是bool。因此,这段代码是非法的:
bool &b = *it;它将尝试获取对从代理对象创建的临时对象的lvalue引用。这是不允许的
因此,不能在任何接受vector<bool>或更高版本的函数中使用ForwardIterators的迭代器。
但是,您的代码并不一定要关心这个问题。只要您控制将那些vector<bool>迭代器传递给什么代码,并且不做任何违反它们行为的操作,那么您就没事了。
就他们的界面而言,他们的行为就像RandomAccessIterators,除非他们没有这样做(见上文)。所以你可以用常数时间复杂度的整数来抵消它们,等等。
vector<bool>很好,只要您不把它当作包含bool的vector,您的代码就能工作,因为它使用的是vector<bool>自己的接口,显然它可以接受。
如果将一对vector<bool>迭代器传递给std::sort,它将无法工作。
发布于 2016-08-20 15:59:56
C++14向量.C++14/2:
除非下面描述,否则所有操作都具有与主
vector模板相同的要求和语义,但处理容器存储中位值的bool值类型映射和allocator_traits::construct(20.7.8.2)的操作不用于构造这些值。
https://stackoverflow.com/questions/39055936
复制相似问题