为啥 std::vector 允许使用 [] 分配,但 size() 和 capacity() 没有改变?

Posted

技术标签:

【中文标题】为啥 std::vector 允许使用 [] 分配,但 size() 和 capacity() 没有改变?【英文标题】:why std::vector allow to use [] to assign, but the size() and capacity() doesn't change?为什么 std::vector 允许使用 [] 分配,但 size() 和 capacity() 没有改变? 【发布时间】:2020-03-17 09:26:54 【问题描述】:

我做如下测试,创建一个vector并将它的容量设置为1,然后使用v[100]=100;直接分配v[100]却不触发core dump,为什么?vector v应该没有足够的内存访问v[100],但是v[100]被成功赋值为100,而size和capacity()都保持为0和1,这怎么理解?

int main()
    std::vector<int> v;
    v.reserve(1); 
    v[100]=100;                      //here does't triggle core dump, wired
    std::cout<<v.size()<<std::endl;  //0 
    std::cout<<v.capacity()<<std::endl; //1
    std::cout<<v[100]<<std::endl;    //100
return 0;

【问题讨论】:

这是未定义的行为,它的工作纯粹是运气。如果您访问无效内存,程序不需要崩溃。引用cppreference:“与 std::map::operator[] 不同,此运算符从不向容器中插入新元素。通过此运算符访问不存在的元素是未定义的行为。”跨度> 【参考方案1】:

这是因为std::vector::operator[] 不进行边界检查。如果您使用无效的索引,则会导致未定义的行为。

如果你想要边界检查,那么你应该使用std::vector::at。如果您使用无效索引,它将引发异常。

v.at(100)=100; // this will throw a std::out_of_range exception

【讨论】:

以上是关于为啥 std::vector 允许使用 [] 分配,但 size() 和 capacity() 没有改变?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 std::vector::data() 中没有使用指针 typedef?

为啥使用 std::vector 而不是 realloc? [关闭]

为啥不能对 std::vector 使用前向声明?

C++ 动态分配的 std::vector

为啥 std::vector 没有 append 方法? [关闭]

为啥使用指针的 STL 算法比 std::vector 迭代器快得多?