vector常用操作

vector常用操作

1、vecotr对象的默认构造

vector<int> v1; //v1是一个空的vector对象,v1的容量为0

class CA{};
vector<CA*> v2;
//用于存放CA对象的指针的vector对象,v2的容量为0
vector<CA> v3;
//用于存放CA对象的vector容器,由于容器元素的存放是按值复制的方式进行的。
//所以此时CA必须提供CA的拷贝构造函数,以保证CA对象间拷贝正常

2、vector带参数的构造

vector(beg, end); //构造函数将[beg, end)区间中的元素拷贝给本身
vector(n, elem); //构造函数将n个elem拷贝给本身
vector(const vector& vec); //拷贝构造函数

vector<int> v1(10); //v1有10个元素,每个元素的值为0
vector<int> v2(3, 10); //v2有3个元素,每个元素的值为10
vector<int> v3{1,2,3,4,5}; //v3有5个元素,每个元素的值为1,2,3,4,5

int arr[] = {1,2,3,4,5};
vector<int> v4(arr, arr+5);     //左开右闭区间,v4有5个元素,每个元素的值为1,2,3,4,5

vector<int> v5(v4); //拷贝了v4的所有元素

vector<int> v6 = v4; //用已经有的vector对象v4初始化v6

3、vector的赋值操作

vector.assign(beg, end); //将[beg, end)区间中的元素拷贝赋值给本身

vector.assign(n,elem); //将n个elem拷贝赋值给本身

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

vector.swap(vec); //将vec与本身的元素互换

    vector<int> v1, v2 ,v3, v4, v5;

    //注意:如果进行覆盖,会将之前的容器先清空,再重新赋值
    v1.assign(5, 100);
    for(int i = 0; i < v1.size(); i++)
    {
        cout <<  v1[i] << " ";
    }
    cout << endl;
    v1.assign(2,3);
    for(int i = 0; i < v1.size(); i++)
    {
        cout <<  v1[i] << " ";
    }
    cout << endl;

vector<int> v1 = {1, 2, 3, 4, 5, 6};
vector<int> v2;
v2.assign(v1.begin() + 3, v1.end() - 2);    //输出4
v2.assign(v1.begin() - 3, v1.end() + 2);    //不报错,

4、vector的容量和大小

vector.size(); //返回容器中元素的个数

vector.empty(); //判断容器是否为空

vector.capacity(); //在现有空间内最多可以容纳多少个元素

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

vector.resize(num, elem); //重新指定容器的长度为num,若容器变长,则以elem填充新位置。如果容器变短,则末尾超出容器长度的元素被删除

将容器变长

    vector<int> v1;
    v1.assign(10, 88);  //10个88
    v1.resize(20);  //显示10个88,后面10位默认填充0
    for(int i = 0; i < v1.size(); i++)
    {
        cout << v1[i] << " ";
    }
    cout << endl;

将容器变短

v1.resize(5);
for(int i = 0; i < v1.size(); i++)
{
    cout << v1[i] << " ";
}
cout << endl;

将容器变长,扩展的元素变为指定

v1.resize(20, 99);      //后续15位变为99
for(int i = 0; i < v1.size(); i++)
{
    cout << v1[i] << " ";
}

5、vector数据访问

vector.at(idx); //返回索引idx所指的数据,若越界,抛出out_of_range异常
vec[idx]; //返回索引idx所指的数据,若越界,不抛出异常,直接报错

    vector<int> v1;
    v1.assign(10, 88);
    cout << v1.at(20) << endl;  //抛出out_of_range异常
    for(int i = 0; i < v1.size(); i++)
    {
        cout << v1[i] << " ";
    }
    cout << endl;
    return 0;

6、vector插入删除

vector.push_back(elem); //在容器尾部加入一个元素elem
vector.pop_back(); //删除容器最后一个元素

注意:此处的pos不为下标,应该是指针
vector.insert(pos, elem); //在pos位置插入一个elem元素的拷贝,返回新数据的位置
vector.insert(pos, n, elem); //在pos位置插入n个elem元素的拷贝,无返回值
vector.insert(pos, begin, end); //在pos位置插入区间[begin, end)的所有元素,无返回值
vector.erase(pos); //删除pos位置的数据,返回下一个数据的位置

7、vector容器的迭代器

迭代器的成员函数:
begin(); //返回容器中第一个数据的位置
end(); //返回容器中最后一个数据的下一个位置
rbegin(); //返回容器中最后一个数据的位置
rend(); //返回容器中第一个数据的前一个位置
cbegin(); //返回容器中第一个数据的常量迭代器
cend(); //返回容器中最后一个数据的下一个位置的常量迭代器
crbegin(); //返回容器中最后一个数据的常量迭代器
crend(); //返回容器中第一个数据的前一个位置的常量迭代器

    int arr[] = {1,2,3,4,5};
    vector<int> v(arr, arr+5);
    vector<int>::iterator it;
    it = v.begin();     //it指向v的第一个元素
    cout << *it << endl;   //输出第一个元素,可以看做it是一个指针

    //通过循环的方式输出v中的元素
    for(it = v.begin(); it != v.end(); it++)
    {
        cout << *it << endl;
    }

8、迭代器失效

vector的insert操作
vector的erase操作

插入元素后失效:

vector<int> v = {1,2,3,4,5};
vector<int>::iterator it;
for(it = v.begin(); it != v.end(); it++)
{
    if(*it == 3)
    {
        v.insert(it, 10);
    }
}

for(it = v.begin(); it != v.end(); it++)
{
    cout << *it << endl;
}

删除元素后失效


    vector<int> v = {1,2,3,3,3,3,3,4};

    vector<int>::iterator it;

    for(it = v.begin(); it != v.end(); it++)
    {
        if(*it == 3)
        {
            v.erase(it);
        }
    }

    for(it = v.begin(); it != v.end(); it++)
    {
        cout << *it << " ";    //1 2 3 3 4
    }
    cout << endl;

删除时正确方式:

for(it = v.begin(); it != v.end();)
{
    if(*it == 3)
    {
        it = v.erase(it);    //删除元素后,it失效,指向下一个元素
    }
    else
    {
        it++;
    }
}

可能会出错的方法:

for(it = v.begin(); it != v.end();)     //再次进入循环判断的时候,会认为it已经失效,所以会报错
{
    if(*it == 3)
    {
        vector<int>::iterator tmp;
        tmp = v.erase(it);      
        cout << *tmp << endl;
    }
    else
    {
        it++;
    }
}
posted @ 2024-12-23 21:43  baobaobashi  阅读(52)  评论(0编辑  收藏  举报