首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >vector<bool>迭代器有保证吗?

vector<bool>迭代器有保证吗?
EN

Stack Overflow用户
提问于 2016-08-20 15:43:04
回答 2查看 566关注 0票数 9

优先选择说,vector<bool>专门化的迭代器是定义的实现,许多迭代器不支持ForwardIterator (因此也不支持RandomAccessIterator)等特性。

cplusplus添加了一个神秘的“最”:

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

我不能进入官方的规格。对于vector<bool>迭代器是否有任何迭代器行为的保证?

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

代码语言:javascript
运行
复制
std::vector<bool> v(4);
int k = 2;
v.insert(v.begin() + k, true);

会一直这样吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-08-20 16:55:57

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

任何在一系列Ts上使用前向迭代器的函数都可以这样做:

代码语言:javascript
运行
复制
T &t = *it;
t = //Some value.

然而,vector<bool>reference类型不是bool&;它们是一个 --它们的行为像bool,但它们不是bool。因此,这段代码是非法的:

代码语言:javascript
运行
复制
bool &b = *it;

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

因此,不能在任何接受vector<bool>或更高版本的函数中使用ForwardIterators的迭代器。

但是,您的代码并不一定要关心这个问题。只要您控制将那些vector<bool>迭代器传递给什么代码,并且不做任何违反它们行为的操作,那么您就没事了。

就他们的界面而言,他们的行为就像RandomAccessIterators,除非他们没有这样做(见上文)。所以你可以用常数时间复杂度的整数来抵消它们,等等。

vector<bool>很好,只要您不把它当作包含boolvector,您的代码就能工作,因为它使用的是vector<bool>自己的接口,显然它可以接受。

如果将一对vector<bool>迭代器传递给std::sort,它将无法工作。

票数 8
EN

Stack Overflow用户

发布于 2016-08-20 15:59:56

C++14向量.C++14/2:

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39055936

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档