C++中的vector容器使用

2 vector容器

array是静态空间,一旦配置了就不可以更改,要更改则需要配置新空间,然后进行赋值。而vector容器是一个动态数组,可以动态的增加和删除元素,内部机制会自动扩充空间以容纳新元素。使用时需要引入#include "vector"

2.1 vector容器的遍历

// vector容器的遍历
void test1() {
    // 1. 构造一个vector对象,通过vector的无参构造,构造一个空的vector容器
    vector<int> v;
    // 2. 添加元素
    v.push_back(10);
    v.push_back(20);
    v.push_back(30);
    // 3. 遍历vector容器,使用迭代器
    // 迭代器:使用普通指针,依次指向vector中的每一个元素
    // begin():获取到的是vector容器中的首元素的地址
    // end():获取到的是vector容器中的最后一位元素的下一位指针
//    vector<int>::iterator it = v.begin();
//    cout << "vector容器的遍历:" << *it << endl;
//    it++; // 指针后移,注意:越界输出会报错
//    cout << "vector容器的遍历:" << *it << endl;
    for (vector<int>::iterator it = v.begin(); it != v.end(); it++){
        cout << "vector容器的遍历:" << *it << endl;
    };

    for (vector<int>::iterator it = v.begin(); it != v.end(); it++){
        if (*it == 20){
            *it = 200;
        };
        cout << "vector遍历时修改值:" << *it << endl;
    };

    // 迭代器遍历时缩写
    // 依次将v容器中的每一个元素,给ele进行赋值
    // 注意:是赋值,所以改变ele的值,不会影响v容器中的元素,如果要修改v容器中的元素,要引用&
    for (int ele:v){
        cout << ele << endl;
    }
    // 遍历、缩写、引用、修改值
    for (int &ele:v){
        if(ele == 10){
            ele = 100; // 这样修改的值才会影响v容器中的元素
        }
    }

    // 倒序遍历
    for (vector<int>::iterator it = v.end();it != v.begin();){
        it--;
        cout << "vector容器的遍历倒序:" << *it << endl;
    }
}

2.2 vector容器的构造函数

// vector容器的构造函数
void test2(){
    // 1. 通过vector的无参构造,构造一个空的vector容器
    vector<int> v1;
    // 2. vector(n, ele) 使用n个ele填充容器
    vector<int> v2(5, 100);
    printVector(v2);
    // 3. vector(const vector& v), 拷贝构造函数

    // 4. vector(v.begin(), v.end()) 左闭右开
    vector<int> v3(v2.begin(), v2.end());  // 将v2容器中从begin->end中的元素拷贝到v3容器中
    printVector(v3);// 注意:end()指向的是最后一个元素的下一个位置,元素从0开始
    vector<int> v4(v2.begin(), v2.begin()+4); // 将v2容器中前4个元素拷贝到v4容器中
    printVector(v4);

    int array[] = {1, 2, 3, 4, 5};
    vector<int> v5(array, array+3);
    // array是0位置的地址,array+3是3位置的地址,由于end()指向的是最后一个元素的下一个元素,所以v5容器中实际有的是0 1 2这三个位置的元素
    // 也可以说成是将array数组的前3个元素拷贝到v5容器中,上面的同理
    printVector(v5);

    // 注意:指针加1,指的是指针向后偏移一个位置,不是单纯的地址的值加1,减同理。
}

2.3 vector容器的赋值操作

// vector的常用赋值操作
void test3(){
    // assign(beg, end); 将[beg, end)区间中的数据拷贝赋值给本身
    // assign(n, ele); 将n个ele拷贝赋值给本身
    // vector& operator = (const vector & vec); // 重载的等号赋值运算符
    // swap(vec); 交换两个vector容器的元素
    int array[] = {1, 2, 3, 4, 5};
    // vector构建
    vector<int> v1;
    v1.assign(array, array+3); // array是数组的首元素的地址,array+3是数组的第4个元素的地址,左闭右开
    printVector(v1);

    vector<int> v2;
    v2.assign(3,10);
    printVector(v2);

    vector<int> v3;
    v3 = v2; // 使用重载后的等号运算符=
    printVector(v3);

    cout << "交换前:" << endl;
    printVector(v1);
    printVector(v2);
    v1.swap(v2);
    cout << "交换后:" << endl;
    printVector(v1);
    printVector(v2);
}

2.4 vector的大小操作

//vector 的大小操作
void test4(){
vector<int> v(10,5);
// 返回容器中元素个数
cout << "容器中元素个数:" << v.size() << endl;
// 判断容器是否为空
cout << "容器是否为空:" << v.empty() << endl;
// 返回容器容量
cout << "容器容量:" << v.capacity() << endl;

// 重新指定长度,不是指定容器的容量,而是容器中元素的个数,如果容器长度不够,会进行扩容
v.resize(20); // 如果新长度大于原来长度,则用默认值填充,也可以指定填充值,如v.resize(20, 100);
cout << "resize,新的长度>原来长度" << endl;
cout << "容器中元素个数:" << v.size() << endl;
cout << "容器容量:" << v.capacity() << endl;
// 如果新长度小于原来长度,则多余的元素被删除;
v.resize(4); // 如果新长度大于原来长度,则用默认值填充,也可以指定填充值,如v.resize(20, 100);
cout << "resize,新的长度<原来长度" << endl;
cout << "容器中元素个数:" << v.size() << endl;
cout << "容器容量:" << v.capacity() << endl;

// 运行发现,容器中元素是4个,容量是20,怎么让它一致呢?
// 创建一个新的空容器,将v容器中的元素拷贝到新容器中,然后交换两个容器,v指向新容器,匿名函数指向旧容器,运行完会自动回收空间
// 拷贝构造新容器时,新容器的容量是跟元素数量一致的,所以容量=元素个数
vector<int>(v).swap(v); // swap收缩空间
cout << "容器中元素个数:" << v.size() << endl;
cout << "容器容量:" << v.capacity() << endl;
}

2.5 vector的数据存取

// vector的存取
void test5(){
    // at(int idx); // 返回索引idx所指的数据,如果idx大于容器中实际元素个数,则抛出异常
    // operator[]; 返回索引idx所指的数据,如果idx大于容器中实际元素个数,则抛出异常
    // front(); 返回容器中第一个数据元素,即0号位元素
    // back();返回容器中最后一个数据元素

    int array[] = {1, 2, 3, 4, 5,6,7,8,9,10};
    vector<int> v(array,array+sizeof(array)/sizeof(array[0]));

    int& ele = v.at(2); // 引用
    cout << v.at(2) << endl;
    ele = 100; // 修改会对v容器中的元素进行修改
    cout << v.at(2) << endl;
    printVector(v);

    int& ele2 = v[2];
    cout << v[2] << endl;
    ele2 = 200;
    printVector(v);

    cout << v.front() << endl;
    cout << v.back() << endl;
}

2.6 vector的插入和删除

// vector的插入和删除
void test6(){
    int array[] = {1, 2, 3, 4, 5,6,7,8,9,10};
    vector<int> v(array,array+sizeof(array)/sizeof(array[0]));
    // insert(const_iterator pos, int count, ele); // 迭代器指向位置pos插入count个元素ele
    // push_back(ele); // 在容器尾部插入元素ele
    // pop_back(); // 删除容器中最后一个元素
    // erase(const_iterator start, const_iterator end); // 删除迭代器[start, end)区间的元素
    // erase(const_iterator pos); // 删除迭代器指向的元素
    // clear(); // 删除容器中所有元素
    v.insert(v.begin()+3,2, 100); // 在容器的3位置处插入2个100,变成了1, 2, 3, 100, 100, 4, 5……
    printVector(v);

    v.push_back(100); // 在容器尾部插入元素100
    printVector(v);

    v.pop_back(); // 删除容器中最后一个元素
    printVector(v);

    v.erase(v.begin()+3, v.begin()+5); // 删除容器中3和4位置的元素,不包括5,先闭后开
    printVector(v);

    v.erase(v.begin()+3); // 删除容器中3位置的元素
    printVector(v);

    v.clear(); // 删除容器中所有元素
//    printVector();

}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值