C++中vector需要注意的几点

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/m0_38126105/article/details/82721613

vector 需要注意的几点问题

  • vector 的size(大小)和capacity(容量)
  • vector 迭代器失效
  • vector 适合场景

vector 我们一般称之为向量,其实就是一个动态数组,支持随机访问,所以只要知道对应的位置,可以在常量时间内访问任何一个元素。

vector 的size(大小)和capacity(容量)

vector 优异效率的秘诀之一就是,分配“较其容纳的元素”更多的内存。为了高效的使用vector,则我们必须了解这方面的知识。
首先,size指的是元素的个数,而capacity指的是容器可以容纳元素的个数。
对于size的大小,相关的函数有:

  1. size() 返回对应容器内元素的个数
  2. empty() 判断容器内是否为空
  3. max_size()判断系统所能分配的最大个数,由系统决定
  4. push_back() 尾端插入一个元素
  5. pop_back() 弹出尾端的最后一个元素

对于capacity的大小,相关的函数有:

  1. capacity() 获取容器内实际可以容纳的元素量
  2. reserve() 改变容量,注意在vector中只能用来增加容量,不能用来缩减容量。
  3. shrink_to_fit() C++11引进,可以缩减容量以符合当前元素的个数,但是不具备强制力。
  4. 如果需要缩减容器的大小,可以匿名对象和swap来缩减容器的大小。如
    vector<string> v1;
    v1.push_back("hello");
    v1.push_back("world");
    v1.push_back("wfs");
    v1.push_back("klh");
    v1.reserve(100);
    cout << v1.capacity() << endl;//容量100
    vector<string>(v1).swap(v1);
    cout << v1.capacity() << endl;//容量为实际的4

为什么要关注capacity,有两个原因:
1.当元素的个数超过了容量的大小,必定会重新分配内存,一旦重新分配内存,vector元素所有相关的reference,point,iteraor都会失效。
2.内存重新分配很消耗时间。

capacity

常见的操作是在vector申请之后,我们主动的根据要求,调整vector的容量,尽量保证不需要内存重新分配,其实只有几句代码,但是效率却提升了:

vector<string> v1;
v1.reserve(5);  //假如只会存入5个元素,则调整容器的大小为5

vector 中的迭代器失效

其实问迭代器失效,就是在问指向元素的那个指针的是非法的。其实所有的容器都是一样的,在插入和删除的时候,改变了内存,这有可能会导致迭代器失效,但是具体的问题是需要具体的分析。
比如,当使用push_back(),则当容器不重新分配,即size小于capacity时,指向容器结尾的迭代器,即插入前v.end()返回的迭代器会失效。当内存重新分配后,这原先的所有迭代器都会失效。又比如调用了erase(),假设其删除了vector中中部一个元素,则部分内存需要重新分配,在删除之前的迭代器可以正常使用,而在删除位置之后的迭代器都会失效。常见的vector,避免删除后,使用无效的迭代器的做法为,使用erase()返回值所给的下一个元素的位置。

#include <iostream>
#include <vector>
#include <string>
using namespace std;

int main()
{
    vector<string> v1;
    v1.reserve(4);
    v1.push_back("hello");
    v1.push_back("world");
    v1.push_back("wfs");
    v1.push_back("klh");
    vector<string>::iterator itor;
    itor = v1.begin();
    for (itor = v1.begin(); itor != v1.end();/*++itor,切忌此处不可以使用++,因为erase已经返回了下一个的地址了*/)
    {
        if (itor != v1.end())
        {
            cout << "*itor is :" << *itor << endl;
        }
        if (*itor == "wfs")
        {
            itor = v1.erase(itor);
        }
        else
        {
            itor++;
        }
    }
    for (itor = v1.begin(); itor != v1.end();++itor)
    {
        cout << "*itor is :" << *itor << endl;
    }
    system("pause");
}

vector 适用的场合

简单一句话,程序要求随意访问,且一般只对末尾的元素进行操作。

猜你喜欢

转载自blog.csdn.net/m0_38126105/article/details/82721613