zoukankan      html  css  js  c++  java
  • vector的 []

    摘自《C++编程剖析》

     1 #include <iostream>
     2 #include <vector>
     3 
     4 using namespace std;
     5 
     6 int main()
     7 {
     8     vector<int> v;
     9     v.reserve(2);
    10     v[0] = 1;
    11     v[1] = 2;
    12 
    13     cout << v[0] << endl;
    14 
    15     v.reserve(100);
    16     cout << v[0] << endl;
    17 }

    输出

    jingyg@jingyg:~/share/mytest/cpp_test$ g++ -std=c++11 test.cpp 
    jingyg@jingyg:~/share/mytest/cpp_test$ ./a.out 
    1
    0

    为什么会这样?
    只可以使用 operator[]()(或 at())去改动那些确实存在于容器中的元素。

    v.reserve(2) 仅仅保证 vector 的容量至少为 2,并不会创建元素。而 v[0] = 1; 也不会创建第一个元素。只是恰好 v[0] 简单返回了用于存放但尚未存放第一个元素的那块空间的引用。

    但是对于 vector 容器而言,它还是空的。当使用 v.reserve(100) 重新分配时,v 会把确实存在的元素复制到新的内存中,所以新的内存中 v[0] 初始值为 0 (严格讲不确定)。

    把 reserve 改成 resize 可以保证正常工作。因为 resize会在容器的尾部添加或删除一些元素。

    总结:

    • 不要用 [] 来添加新的元素,[] 只可以改确实存在的元素,应使用 push_back() 添加新元素
    • size和resize,capacity和reserve 两种不同的概念
    • 如果需要越界检查,可以使用 at(),会抛出 std::out_of_range异常
  • 相关阅读:
    14-补充内容:MySQl创建用户和授权
    15-可视化工具Navicat的使用
    11-数据的增删改
    12-单表查询
    09-完整性约束
    10-外键的变种 三种关系
    07-数据类型
    08-数据类型(2)
    Mysql 基本语法
    E. K-periodic Garland
  • 原文地址:https://www.cnblogs.com/jingyg/p/5703227.html
Copyright © 2011-2022 走看看