了解标准::矢量规范
Understanding std::vector specification
c++14 标准 n4140 [vector.overview]/1 的草案如下:
向量是支持随机访问迭代器的序列容器。此外,它还支持(摊销(最后的恒定时间插入和擦除操作;中间的插入和擦除需要线性时间。存储管理是自动处理的,但可以给出提示以提高效率。向量的元素是连续存储的,这意味着如果
v
是一个vector<T, Allocator>
,其中T
是bool
以外的某种类型,那么它服从所有0 <= n < v.size()
的恒等&v[n] == &v[0] + n
。
为什么除布尔值之外的所有类型的恒等&v[n] == &v[0] + n
0 <= n < v.size()
都是正确的?据我所知,C++是字节解决的。因此,这应该仅适用于大小为一个字节的类型。
&v[0]
是指向由向量括起来的类型(vector<bool>
除外(的指针。&v[0]
+ n 更改指针以指向第 n 个元素,而不管该元素的大小(以字节为单位(。
正如巴里所指出的,vector<bool>' is a specialization to reduce the space consumed and pack bits. It's unlike all other
载体的容器。在执行以下操作时,这会产生问题:
vector<bool> b{true, false};
auto& val=b[0];
Val 不是对布尔值的引用!
因为vector<bool>
不仅仅是一个拥有bool
s的vector
。这是一种完全不同的野兽。它有部分专用化 - 它表现为动态位集,在一个字节中存储 8bool
秒。所以这个身份不成立。事实上,你甚至无法从vector<bool>
中得到一个bool&
,你只能得到代理引用。
因此,这应该仅适用于大小为一个字节的类型。
这里的尺寸无关紧要。&v[n] == &v[0] + n
适用于所有类型,但bool
除外。对于bool
,这是格式不正确的,因为&v[0]
根本不是一个有效的表达式(更不用说指针了(。
换个说法。对于除bool
之外的所有T
,vector<T>
的行为很像具有动态已知长度的T[]
。v[i]
是一个特定的T
,&v[i]
是一个指向特定T
的指针。你所知道和喜欢的关于数组的一切都适用于vector
。就像那个指针身份一样。
但vector<bool>
不是bool[]
.v[i]
不是一个特定的bool
,它是一个可转换为bool
的对象。&v[i]
不是指向特定bool
的指针,它甚至不是一个有效的表达式,因为它不是左值v[i]
。
您尝试使用vector<T>
用于未知T
的事情与其他所有T
一起使用bool
失败,例如:
std::vector<T> v = ...;
for (auto& elem : v) { ... } // ok for every T. except bool.
- 正在尝试了解输入验证循环
- 使用CMake检测支持的C++标准
- 如何理解C++标准N3337中的expr.const.cast子句8
- "throw expression code" 1e7 >返回 d 是什么?投掷标准::overflow_error( "too big" ) : d;意味 着?
- 了解 GLM- openGL 中的相机转换
- 编译标准库类型
- C++我需要了解在哪里使用指针和双指针
- 如何深入了解明显的腐败
- 标准是否使用多余的大括号(例如 T{{{10}}})定义列表初始化?
- 编译器如何在使用SFINAE的函数和标准函数之间确定两者是否可行
- 了解嵌套循环打印星号图案
- 铸造标准::有没有回到原来的类型
- 标准 N3337 5.2.10 第 7 条中的C++"类型"是什么意思?
- 了解C++标准::shared_ptr
- 了解内存序列和标准::memory_order_relaxed
- 了解标准::矢量规范
- 了解标准::地图::查找
- 了解标准::复制
- 了解标准::原子内存屏障
- 了解“标准::is_move_constructible”