vector相关操作总结

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


void print_vec(const std::vector<int>& vec)
{
    for (auto x : vec) {
        std::cout << ' ' << x;
    }
    std::cout << '\n';
}

int main()
{
    vector<int> vecInt;
    vecInt.push_back(1);
    vecInt.push_back(2);

    /////////一.元素访问 /////////////
    //1.at会进行越界检查 越界时,会报std::out_of_range的异常      //而[]操作, 会报断言错误, 这个try是抓取不了的
    try
    {
        cout << vecInt.at(2) << endl;
    }
    catch (std::out_of_range)
    {
        cout << "存在越界问题" << endl;
    }
    
    //2.front() 第一个元素
    cout << "第一个元素: " << vecInt.front() << ", 地址: "<<  &(vecInt.front())<< endl;
    //3.back() 最后一个元素
    cout << "最后一个元素: " << vecInt.back() << ", 地址: " << &(vecInt.back()) << endl;
    //4. data() 返回第一个元素对应的地址 !!记得带()
    cout << "data():" << vecInt.data() << endl;
    cout << "data+1:" << vecInt.data() + 1 << endl; //指针加1,就是指向下一个元素.

    /////////二.迭代器 /////////////
    //1.begin,cbegin 后者返回一个const_iterator,表示所指向的数据不能够修改,类似有常量指针吧.
    //2.end, cend 前者指向vector最后元素的后一元素,该元素表现为占位符,访问会导致未定义行为.
    //3.rbegin, rcbegin 前者指向容器最后元素,若vector为空,则返回值等于rend().


    /////////三.容量 /////////////
    //1.empty()
    cout << "Is empty?" << vecInt.empty() << endl;
    //2.size() 当前vector元素的个数
    cout << "size():" << vecInt.size() << endl;
    //3.max_size() 此值反映容器大小上的理论上限,可用的RAM总量会影响该值.
    cout << "Maximum size of a 'vector' is" << vecInt.max_size() << endl;
    //4.reserve(new_cap) 增加vector的容量.若new_cap大于当前的capacity(),则分配新内存,此时所有迭代器和引用都被非法化,否则不做处理.
    //reserve()不更改vector的size().
    //5.capacity() 返回分配的容量值
    cout << "capacity(): " << vecInt.capacity() << endl;
    //6.shrink_to_fit请求移除未使用的容量
    vector<int> vecInt2;
    cout << "default capacity:" << vecInt2.capacity() << endl;
    vecInt2.reserve(100);
    cout << "after reserve capacity:" << vecInt2.capacity() << endl;
    vecInt2.clear();
    cout << "after clear capacity:" << vecInt2.capacity() << endl;
    vecInt2.shrink_to_fit();
    cout << "after shrink_to_fit capacity:" << vecInt2.capacity() << endl;

    /////////四.修改器 /////////////
    //1.clear() 清空vector,执行后size()为0
    //2.insert(pos, n, val),其中n可以省略:表示插入到pos前面,返回值是插入元素的迭代器.
    //insert(iterator pos, InputIt first, InputIt last);可以插入容器类型的元素的全部或者部分.
    std::vector<int> vec(3, 100);
    print_vec(vec);
    cout << "capacity1:" << vec.capacity() << endl;

    auto it = vec.begin();
    it = vec.insert(it, 200);
    print_vec(vec);
    cout << "capacity2:" << vec.capacity() << endl;

    it = vec.insert(it, 2, 300);
    print_vec(vec);
    cout << "capacity3:" << vec.capacity() << endl;

    // "it" 不再合法,获取新值:
    it = vec.begin();

    std::vector<int> vec2(2, 400);
    vec.insert(it + 2, vec2.begin(), vec2.end());
    print_vec(vec);
    cout << "capacity4:" << vec.capacity() << endl;

    int arr[] = { 501,502,503 };
    vec.insert(vec.begin(), arr, arr + 3);
    print_vec(vec);
    cout << "capacity5:" << vec.capacity() << endl;

    //3.erase(pos) 移除位于pos的元素
    //erase(first, last) 移除范围[first, last)的元素 
    //会非法化位于擦除点或之后的迭代器,包含end()迭代器.

    //4.push_back 
    //5.pop_back 移除末尾元素
    //swap(vector &other) 将内容与other交换.
    vector<int> vecInt3;
    vecInt3.swap(vecInt);
    cout << "vecInt:";
    print_vec(vecInt);
    cout << "vecInt3:";
    print_vec(vecInt3);
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/Stephen-Qin/p/12690302.html