STL容器vector


一、什么是Vector
        向量(Vector)是一个封装了动态大小数组的顺序容器(Sequence Container)。跟任意其它类型容器一样,它能够存放各种类型的对象。可以简单的认为,向量是一个能够存放任意类型的动态数组。

二、定义和初始化Vector对象

//初始化vector对象的方法
vector V1;
vector v2(v1);
vector v3 = v2;
vector v4(n, val);
vector v5(n);
vector v6{a, b, c};
vector v7 = {1, 2, 3};

三、增加函数

void push_back(const T& x);
//向量尾部增加一个元素X
iterator insert(iterator it,const T& x);
//向量中迭代器指向元素前增加一个元素x
iterator insert(iterator it,int n,const T& x);
//向量中迭代器指向元素前增加n个相同的元素x
iterator insert(iterator it,const_iterator first,const_iterator last);
//向量中迭代器指向元素前插入另一个相同类型向量的[first,last)间的数据

1、使用push_back,将一个元素追加到vector的尾部

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

int main(){
    vector<string> v1;
     string str;
     while(cin >> str){
         v1.push_back(str);
     }
     for(auto x : v1){    //范围for语句
         cout << x << " ";
     }
     cout << endl;
    return 0;
}

2、insert函数允许在容器任何位置插入一个或多个元素,每个Insert函数接收迭代器作为其第一个参数,指出在容器什么位置放置新元素。

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

int main(){
    vector<string> v1;
    vector<string> v2 = {"z3", "w5", "y2"};
     string str;
     
     v1.insert(v1.begin(), "Hello");
     v1.insert(v1.end(), 3, "World");  //插入范围元素 
     v1.insert(v1.begin(), v2.begin(), v2.end()); //接收一对迭代器,将范围中的元素插入 
     
     for(auto x : v1){
         cout << x << " ";
     }
     cout << endl;
    return 0;
}

通过insert的返回值,可以在一个特定位置反复插入元素

四、删除函数

iterator erase(iterator it);//删除向量中迭代器指向元素
iterator erase(iterator first,iterator last);//删除向量中[first,last)中元素
void pop_back();//删除向量中最后一个元素
void clear();//清空向量中所有元素

1、删除vector中所有奇数元素

#include 
#include
using namespace std;

int main(){
    
    vector<int> v1 = {1, 2, 3, 4, 5};
    auto it = v1.begin();
    while(it != v1.end()){
        if(*it % 2) it = v1.erase(it);
        else ++it;
    }
    
    for(auto x : v1){
        cout << x << " ";
    }
        cout << endl;
    return 0;
}

2、删除一个范围内的所有元素

五、其他函数

void swap(vector&);//交换两个同类型向量的数据
void assign(int n,const T& x);//设置向量中前n个元素的值为x
void assign(const_iterator first,const_iterator last);//向量中[first,last)中元素设置成当前向量元素

六、迭代器失效

迭代器失效是指迭代器底层对应的指针所指的空间无效了,而使用一块已经被释放的空间,造成的后果是程序崩溃。

1、扩容导致迭代器失效。vector插入元素可能会导致容量不足,会触发扩容,导致整个vector重新申请内存,并且将原有的数据复制到新的内存中,并将原有内存释放,迭代器所指的内存释放,迭代器失效。

#include 
#include
using namespace std;

int main(){
    
    vector<int> v1;
    v1.push_back(6);
    v1.push_back(9);
    auto it = v1.begin();
    
    cout << "v1的容量为:" << v1.capacity() << endl;  //容量为2 
    cout << *it << endl;
    
    v1.push_back(10);  //扩容,迭代器失效 
    v1.push_back(5);
    cout << "v1的容量为:" << v1.capacity() << endl;
    cout << *it << endl;
    return 0;
}

2、insert导致迭代器失效

#include
#include
using namespace std;

int main()
{
    vector<int> ta;
    for (int i = 0; i < 13; i++)
    {
        ta.push_back(i);
    }

    vector<int>::iterator it = ta.begin();

    it += 5;

    cout << "容量是  " << ta.capacity() << endl;
    cout << "it的值是  " << *it << endl;
    ta.insert(it, 100);

    cout << "insert后容量是    " << ta.capacity() << endl;
    cout << "此时it指向的值是    " << *it << endl;

    return 0;
}

3、erase导致迭代器失效

#include
using namespace std;
#include

int main()
{
    vector<int> ta;
    for (int i = 0; i < 10; ++i)
    {
        ta.push_back(i);
    }

    vector<int>::iterator it = ta.begin();

    it += 5;
    cout << "容量是  " << ta.capacity() << endl;
    cout << "it的值是  " << *it << endl;

    ta.erase(it);  //迭代器失效
    cout << "erase后容量是    " << ta.capacity() << endl;
    cout << "此时it指向的值是    " << *it << endl;

    return 0;
}

对于序列式容器,比如vector,插入删除当前的iterator会使后面所有元素的iterator都失效。