Bootstrap

C++_STL常用容器_vector容器

一、vector 容器

1、vector 基本概念

功能:vector 数据结构和数组非常类似,也称为单端数组

vector 和普通数组的区别:数组是静态空间,vector 可以动态扩展

动态扩展:并不是在原空间之后续接新空间,而是找更大的空间,然后将原数据拷贝新空间,释放原空间

vector 容器的迭代器是支持随机访问的迭代器

2、vector 构造函数

功能:创建vector容器

函数原型:

  • vector v; 采用模版实现类实现,默认构造函数

  • vector (v.begin(), v.end()) 将begin 和 end 区间中的元素 拷贝给本身

  • vector (n,elem) 构造函数 将 n 个 elem 拷贝给自身

  • vector (const vector & vec) 拷贝构造函数

// vector 容器的构造函数
void printV(vector<int> v){
    for (vector<int>::iterator i = v.begin();i != v.end();i++){
        cout << *i << " ";
    }
    cout << endl;
}

/*
 - vector <T> v;    采用模版实现类实现,默认构造函数

 - vector (v.begin(), v.end())  将begin 和 end 区间中的元素 拷贝给本身

 - vector (n,elem) 构造函数 将 n 个 elem 拷贝给自身

 - vector (const vector & vec) 拷贝构造函数

*/
void te01(){
    vector<int> t; // 默认构造,无参构造
    for (int i = 0;i <10 ;i++){
        t.push_back(i+1);
    }
    printV(t);

    // 通过区间的方式进行构造
    vector<int> t1(t.begin(),t.end());
    printV(t1);

    // 构造函数将 n 个 elem 拷贝给自身
    vector<int> t2(5,10); // 5 个 10
    printV(t2);

    vector<int> t3(t2);
    printV(t3);

}
3、vector 赋值操作

功能:给vector 容器赋值

函数原型:

  • vector & operator=(const vector & vec)// 重载等号操作符

  • assign (beg,end) 将(beg,end)区间中的数据拷贝赋值给本身

  • assign (n,elem) 将n个elem 拷贝赋值给本身

// vector 的赋值操作
    // 1 operator=
    vector<int> v1;
    v1 = t;
    printV(v1);

    // 2 assign
    vector<int> v2;
    v2.assign(v1.begin(),v1.end());
    printV(v2);

    // 3 assign
    vector<int> v3;
    v3.assign(10, 1); // 表示给v3 赋10 个1
    printV(v3);
4、vector 容量和大小

对 vector 容器的容量和大小操作

函数原型:

  • empty() 判断容器是否为空

  • capacity() 容器的容量

  • size() 返回容器中元素的个数

  • resize(int num) 重新指定容器的长度为num。若容器变长,则以默认值填充新位置。如变短,末尾超出容器长度的元素被删除

  • resize(int num,elem)重新指定容器的长度为num,若容器变长,则以elem 填充新位置,变短,末尾元素删除

void te02(){      // 容器容量大小操作
    vector<int> v1;
    for (int i = 0;i < 10;i++){
        v1.push_back(i);
    }
    printV(v1);

    cout << v1.empty() << endl;
    if(v1.empty()){
        cout << "v1 没有元素" << endl;
    }else{
        cout << "v1 有元素" << endl;
        cout << "v1 元素个数为:" << v1.size() << endl;
        cout << "v1 容量大小为:" << v1.capacity() << endl;
    }

    v1.resize(5);
    printV(v1);
    v1.resize(10);
    printV(v1);
    /*
     0 1 2 3 4
     0 1 2 3 4 0 0 0 0 0 */

}
5、vector 插入和删除

对vector 容器进行插入和删除操作

函数原型:

  • push_back(elem) :尾部插入元素 elem

  • pop_back():删除最后一个元素

  • insert(const_iterator pos,ele):迭代器指向位置pos 插入元素 ele

  • insert(const_iterator pos,int count,ele):迭代器指向位置pos 插入count 个元素 ele

  • erase(const_iterartor pos):删除迭代器指向元素

  • erase(constiterator start,constiterator end):删除迭代器从start 到 end 之间的元素

  • clear():删除容器中所有元素

void te03(){ // 对容器进行插入和删除
    vector<int> v1;
    for(int i = 0;i < 10;i++){
        v1.push_back(i);
    }
    printV(v1);

    v1.pop_back();  //删除最后一个元素
    printV(v1);

    // 第一个参数是迭代器
    v1.insert(v1.begin(), 99);
    printV(v1);

    v1.insert(v1.begin(),2,88);
    printV(v1);

    // 删除第一个参数是迭代器
    v1.erase(v1.begin());
    printV(v1);

    //v1.erase(v1.begin(), v1.end());
    v1.clear();
    printV(v1);
}
6、vector 数据存取

对数据进行存取操作

函数原型:

  • at(int idx):返回索引 idx 所指的数据

  • operator【】:返回索引idx 所指的数据

  • front():返回第一个数据

  • back():返回容器中的最后一个元素

void te04(){ // 数据存取操作
    vector<int> v1;
    for(int i = 0;i < 10;i++){
        v1.push_back(i+1);
    }
    for (int i = 0;i < 10 ;i++){
        cout << v1.at(i) ;
    }
    cout << endl;
    cout << v1.at(4) << endl;
    cout << v1[3] << endl;
    cout << v1.front() << endl;
    cout << v1.back() << endl;

}
7、vector 互换容器

实现两个容器内元素进行互换

函数原型:

  • swap(vec):将vec 与本身的元素互换
void te05(){//vector 互换容器
    vector<int> v1;
    for(int i = 0;i < 10;i++){
        v1.push_back(i+1);
    }
    printV(v1);

    vector<int> v2;
    for(int i = 10;i > 0;i--){
        v2.push_back(i);
    }
    printV(v2);
    v2.swap(v1);
    printV(v1);
    printV(v2);
    /*
     1 2 3 4 5 6 7 8 9 10
     10 9 8 7 6 5 4 3 2 1
     10 9 8 7 6 5 4 3 2 1
     1 2 3 4 5 6 7 8 9 10 */
}

swap 可以使两个容器互换,可以达到实用的收缩内存效果

8、vector 预留空间

减少 vector 在动态扩展容量时的扩展次数

函数原型:

  • reserve(int len):容器预留 len 个元素长度,预留位置不初始化,元素不接访问
void te06(){ // vector 预留空间
    vector<int> v1;

    // 利用reserve预留空间
    v1.reserve(100000);  // num 就是为1了

    int num = 0; // 统计开辟的次数
    int *p = NULL;

    for(int i = 0;i < 100000;i++){
        v1.push_back(i+1);

        if (p != &v1[0]) {
            p = &v1[0];
            num++;
        }
    }
    cout << num << endl;  //18,相当于开辟了 18 次内存,动态申请了18次内存

}

 当数据量比较大的时候,可以一开始就利用reserve预留空间

;