STL vector

使用vector时需要包含头文件<vector>

  • vector的特点
    vector动态数组类:
    1、无论数组中存在多少元素,在数组末尾添加新元素时所需时间都是固定的。
    2、在数组中间添加或者删除元素时,与该元素后面的元素个数成正比。
    3、储存的元素是动态的,vector类负责管理内存。

  • vector的初始化

    下面的代码介绍了vector的几种初始化方法。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    //默认初始化
    vector<int> intVec;

    //初始化时设置至少包含的元素数(并没有限制大小),每个元素初始值默认为0
    vector<int> intVec1(10);

    //同上,并设置每个元素的初始化值
    vector<int> intVec2(10, 66);

    //使用另外一个vector来初始化
    vector<int> intVec3(intVec2);

    //使用另一个vector的两个迭代器来初始化
    vector<int> intVec4(intVec2.cbegin(), intVec2.cbegin() + 5);

cbegin()和cend()是C++11新增的,它们返回一个const的迭代器,不能用于修改元素。

  • vector插入元素

    使用成员函数push_back()在容器末尾插入元素;使用insert()在指定位置插入元素。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    vector<int> intVec(5);
    intVec.push_back(66);
    cout << intVec.size() << endl; //6

    //在指定位置插入元素
    intVec.insert(intVec.begin(), 67);

    //在指定位置插入指定个数的某个元素
    intVec.insert(intVec.begin(), 2, 66);

    //在指定位置插入另一个vector的内容(使用迭代器指定范围)
    vector<int> anoVec(3, 65);
    intVec.insert(intVec.begin(),
    anoVec.begin(), anoVec.end());

使用insert插入元素时,效率较低,与其特点有关。

  • 访问vector中的元素

    使用下标用算符[]访问元素,超出容器边界时结果不确定。
    使用成员方法at()访问元素,超出容器边界时将会报错。
    使用迭代器访问元素。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    vector<int> intVec;
    intVec.push_back(64);
    intVec.push_back(65);
    intVec.push_back(66);
    //使用 [] 访问元素
    for (size_t i = 0; i < intVec.size(); ++i) {
    cout << intVec[i] << endl;
    }
    //使用 at() 访问元素
    for (size_t i = 0; i < intVec.size(); ++i) {
    cout << intVec.at(i) << endl;
    }
    //使用迭代器访问元素
    for (vector<int>::const_iterator pos = intVec.begin()
    ; pos != intVec.end()
    ; ++pos)
    {
    cout << *pos << endl;
    }
  • 删除vector中的元素

    使用pop_back()从vector中删除元素所需要的时间是固定的。
    不能使用偏移位置和元素数删除指定个数的元素。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    vector<int> intVec;
    intVec.push_back(64);
    intVec.push_back(65);
    intVec.push_back(66);

    //删除vector末尾的元素
    intVec.pop_back();

    //删除迭代器指向的元素
    intVec.erase(intVec.begin());

    //删除两个迭代器之间的元素
    intVec.erase(intVec.begin(), intVec.begin() + 2);
  • 大小和容量的区别

    可以通过成员函数size()和capacity()来获取vector的大小和容量。
    容量总是大于等于大小,当当前容量不足时,重新分配容量时,会分配比当前所需容量更大的容量(比如容量满时再插入数据时,可能会分配两个元素的容量,或者更多)。
    可使用成员函数reserve(number),设置当前容器的容量(如果传入的number小于size的话,默认使用size的值。)

STL deque

发音:/dek/
使用时要包含头文件
deque与vector极其相似,只是可以使用成员函数push_front()和pop_frone()在开头插入和删除元素。


 评论