代码之家  ›  专栏  ›  技术社区  ›  OutOfBound

理解std::vector规范

  •  0
  • OutOfBound  · 技术社区  · 6 年前

    [vector.overview]/1 声明如下:

    向量是支持随机访问迭代器的序列容器。此外,它支持(摊销)固定时间插入和擦除操作结束;中间的插入和擦除需要线性时间。存储管理是自动处理的,不过可以给出提示以提高效率。向量的元素是连续存储的,这意味着如果 v 是一个 vector<T, Allocator> T 是其他类型的 bool &v[n] == &v[0] + n 对所有人 0 <= n < v.size() .

    & 对所有人 0<=n<v、 大小() 除了bool以外的所有类型都是?据我的理解,C++是字节加起来的。所以这只适用于大小为一个字节的类型。

    2 回复  |  直到 6 年前
        1
  •  3
  •   Barry    6 年前

    因为 vector<bool> 不仅仅是一个 vector 这是正确的 bool s。它是一种完全不同的野兽。有一个 partial specialization 布尔 在一个字节中。所以这个身份不成立。事实上,你甚至不能得到一个 bool& 从一个 向量<布尔> ,仅获取代理引用。

    所以这只适用于类型, .

    这里的尺寸无关紧要。 &v[n] == &v[0] + n 全部的 类型, 除了 . 为了 ,这是病态的,因为 &v[0]


    换一种说法。对所有人 T 除了 布尔 , vector<T> 表现得很像 T[] 具有动态的已知长度。 v[i] 是一个特定的 T型 , &v[i] T型 . 你所知道和喜爱的关于数组的一切都适用于 矢量 . 就像那个指针一样。

    向量<布尔> bool[] . 五[一] 布尔 ,它是可转换为的对象 布尔 . & 不是指向特定 布尔 ,它甚至不是有效的表达式,因为 不是左值。

    向量<T> 对于未知 和其他人一起工作 T型 失败 ,例如:

    std::vector<T> v = ...;
    for (auto& elem : v) { ... } // ok for every T. except bool.
    
        2
  •  4
  •   doug    6 年前

    &v[0] vector<bool> ). & +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];
    

    瓦尔不是指布尔!