【发布时间】:2016-12-27 14:41:21
【问题描述】:
cppreference 表示vector<bool> 特化的迭代器是实现定义的,并且许多不支持像ForwardIterator 这样的特征(因此RandomAccessIterator)。
cplusplus加了一个神秘的“最”:
容器使用的指针和迭代器类型不是 既不是指针也不是一致的迭代器,尽管它们 应模拟他们的大部分预期行为。
我无权访问官方规范。 vector<bool> 迭代器是否有任何迭代器行为保证?
更具体地说,如何编写符合标准的代码来在vector<bool> 中间插入一个项目?以下适用于我尝试过的几个编译器:
std::vector<bool> v(4);
int k = 2;
v.insert(v.begin() + k, true);
会一直这样吗?
【问题讨论】:
-
一句话:不!
std::vector<bool>专业化被打破了, -
一句话:是的!除非你赞同(太普遍的)观念,即如果它不完美,那就没用了。工程就是让事情发挥作用,而不是抱怨它们不是你想要的。
-
@PeteBecker:
std::sort将在来自vector<bool>.的迭代器上工作如果该问题的答案是“我不知道”(确实如此),那么事情就无法正常工作。是的,用户 可以编写从vector<bool>获取迭代器的代码。但不能保证任何标准库算法都可以使用它们。 -
@NicolBolas - C++14 [vector.bool]/2 似乎不同意你的观点。
-
@PeteBecker:C++14 [forward.iterators]/1 同意我的观点。请参阅下面的答案。