STL_vector容器

1 创建方式

  1. std::vector<dataType> name;  // 创建一个空的vector容器。
  2. std::vector<int> name {1, 2, 3, 4}; //创建容器的同时初始化容器数据类型和元素个数。
  3. std::vector<dataType> (len); // 创建容器的同时指定元素个数但不初始化。
  4. std::vector<dataType> (len,value); // 创建容器的同时指定元素个数为len,并将所有元素值初始化为value,其中value可以为常量也可以为变量表示。
  5. 复制存储类型相同的其他vector容器:
    1. std::vector<char>value1(5, 'c');
    2. std::vector<char>value2(value1);  // 将value1中的元素赋值为value2
  6. 复制存储类型相同的其他vector容器指定范围的值:
    1. int array[]={1,2,3};
    2. std::vector<int>values(array, array+2);//values 将保存{1,2}
    3. std::vector<int>value1{1,2,3,4,5};
    4. std::vector<int>value2(std::begin(value1),std::begin(value1)+3);//value2保存{1,2,3}

使用reverse()成员函数重新定义vector容器容量时,其内存地址有可能会改变,所以其原有创建好的迭代器有可能会发生改变,使用时可以重新进行生成。

2 成员函数

表1 vector成员函数

函数成员函数功能
reserve()增加容器的容量。
shrink _to_fit()将内存减少到等于当前元素实际所使用的大小。
operator[ ]重载了 [ ] 运算符,可以向访问数组中元素那样,通过下标即可访问甚至修改 vector 容器中的元素。
at()使用经过边界检查的索引访问元素。
front()返回第一个元素的引用。
back()返回最后一个元素的引用。
data()返回指向容器中第一个元素的指针。
assign()用新元素替换原有内容。
push_back()在序列的尾部添加一个元素。
pop_back()移出序列尾部的元素。
insert()在指定的位置插入一个或多个元素。
erase()移出一个元素或一段元素。
clear()移出所有的元素,容器大小变为 0。
swap()交换两个容器的所有元素。
emplace()在指定的位置直接生成一个元素。
emplace_back()在序列尾部生成一个元素。

3 访问容器元素方式

(1)下标索引访问(vector中也提供了at()成员函数)。

(2)成员函数front()和back(),分别返回元素的引用。

(3)data() 成员函数,返回的是容器中首个元素的指针

(4)迭代器访问。

(4) 使用基于范围的循环:

#include <iostream>
#include <vector>
using namespace std;
int main()
{
    vector<int> values{1,2,3,4,5};
    for (auto&& value : values)
        cout << value << " ";
    return 0;
}
输出:
1 2 3 4 5 

4.4 添加元素

(1)将元素添加在容器的尾部:

  1. push_back()
  2. emplace_back()       C++11中新增的功能,实现的功能和push_back()一样。

区别:

使用push_back()时,会先创建这个元素,然后优先选择调用移动构造函数(第二选择拷贝构造函数),将该元素移动或者拷贝到容器中(拷贝的话会自行销毁之前创建的该元素),而emplace_back()会在该容器的尾部直接创建这个元素。

#include <vector> 
#include <iostream> 
using namespace std;
class testDemo
{
public:
    testDemo(int num):num(num){
        std::cout << "调用构造函数" << endl;
    }
    testDemo(const testDemo& other) :num(other.num) {
        std::cout << "调用拷贝构造函数" << endl;
    }
    testDemo(testDemo&& other) :num(other.num) {
        std::cout << "调用移动构造函数" << endl;
    }
private:
    int num;
};
int main()
{
    cout << "emplace_back:" << endl;
    std::vector<testDemo> demo1;
    demo1.emplace_back(2);  
    cout << "push_back:" << endl;
    std::vector<testDemo> demo2;
    demo2.push_back(2);
}

(2)容器指定位置插入元素

1 insert():

有四种对应的语法格式,返回的都是新插入第一个元素的位置。

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

int main()
{

    std::vector<int> v1(10, 1);
    std::vector<int> v2 {5, 5, 5};
    
    // 1 iterator insert(pos,elem)——在迭代器 pos 指定的位置之前插入一个新元素elem,并返回表示新插入元素位置的迭代器。
    v1.insert(v1.begin(), 2);
    
    // 2 iterator insert(pos,n,elem)——在迭代器 pos 指定的位置之前插入 n 个元素 elem,并返回表示第一个新插入元素位置的迭代器。
    v1.insert(v1.begin()+1, 2, 3);
    
    // 3 iterator insert(pos,first,last)——在迭代器 pos 指定的位置之前,插入其他容器(不仅限于vector)中位于 [first,last) 区域的所有元素,并返回表示第一个新插入元素位置的迭代器。
    v1.insert(v1.begin(), v2.begin(), v2.end());
    
    // 4 iterator insert(pos,initlist)——在迭代器 pos 指定的位置之前,插入初始化列表(用大括号{}括起来的多个元素,中间有逗号隔开)中所有的元素,并返回表示第一个新插入元素位置的迭代器。
    v1.insert(v1.begin(), {6, 6, 6, 6});
    
    for(auto i=v1.begin(); i!=v1.end(); i++){
            
        cout << *i << endl;
    
    }


}

2 emplace

emplace() 是 C++ 11 标准新增加的成员函数,只能在vector容器的指定位置前插入一个的元素。

语法格式:

iterator emplace (const_iterator pos, args...);     // 函数返回的时新插入元素位置的迭代器。

同上,emplace在插入元素时,也是直接在插入位置生成一个新的元素,而不是单独生成后再将其移动或者复制到容器中。

 在vector容器中,访问、添加、插入元素都只能借助vector模板类中提供的成员函数,删除操作中除了成员函数外,还可以借助一些全局函数。

5 删除元素

 表2 删除vector元素的几种方式。

函数功能
pop_back()删除 vector 容器中最后一个元素。(无返回值)
erase(pos)删除 vector 容器中 pos 迭代器指定位置处的元素,并返回指向被删除元素下一个位置元素的迭代器。
erase(beg,end)删除 vector 容器中位于迭代器 [beg,end)指定区域内的所有元素,并返回指向被删除区域下一个位置元素的迭代器
remove(first, last, elm)删除容器中所有和指定元素值相等的元素(定义在<algorithm>头文件中),并返回指向最后一个元素下一个位置的迭代器。值得一提的是,调用该函数不会改变容器的大小和容量。
clear()删除 vector 容器中所有的元素,使其变成空的 vector 容器。

 swap() 函数在头文件 <algorithm> 和 <utility> 中都有定义,使用时引入其中一个即可。

关于remove的详细介绍在:

 remove函数使用方法_北城路人的博客-CSDN博客


版权声明:本文为weixin_42542290原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。