• STLvector的使用_各种花哨用法总结


    vector,向量,有序数列。连续的空间存储,可以使用[ ]操作符,可以快速的访问随机的元素,快速的在末尾插入元素,但是在序列中间随机的插入、删除元素要慢。如果空间不够时,有一个重新分配更大空间的过程。

    入门使用

    #include<vector>
    vector<int> vec = {1,2,3};//11标准支持
    vec.push_back(4);
    vec.push_back(5);
    for(int i=0;i<vec.size();++i) 
        cout<<vec[i];
    

    常用方法一览

        vec.push_back(x);//在数组的最后添加一个元素 x 。
        vec.pop_back();//无参,去掉数组的最后一个数据。
        vec.begin();//无参,返回数组头的迭代器。
        vec.end();//无参,返回数组的最后一个单元+1的迭代器。
        vec.clear();//无参,清空当前的vector。
        vec.empty();//无参,判断vector是否为空。
        vec.size();//无参,返回当前使用数据的大小。
        vec.capacity;//无参,返回当前vector分配的大小。
        vec.max_size();//无参,返回vector最大可以是多大。
        vec.at(p);//返回数字 p 位置的数据。比 [ ] 操作符安全,有超出范围检查,超出范围可以抛异常。
        int a = vec.front();//无参,返回数组头的引用。对 a 的修改不会影响vector的内容。
        int &a = vec.front();//无参,返回数组头的引用。对 a 的修改同时会改变vector对应的元素^1^。
        int b = vec.back();//无参,返回数组的最后单元的引用。同front()。
        vec.erase(iterator position);//删除迭代器指向的元素,容器大小改变,已有迭代器可能实效。
        vec.erase(iterator first,iterator last);//删除[first,last)中元素。
        vec.swap(vec2);//与另一个vector交换数据。
    

    进阶使用

    以vector vec,vec2;为例,iter通指vector::iterator。

    创建与初始化

    vector<int> vec;//创建一个空vector。
    vector<int> vec = {1,2,3};//列表初始化为{1,2,3}。对于vector<int>类型的函数可以直接用{1,2,3}。
    vector<int> vec(int n);//创建一个大小为 n 的vector。
    vector<int> vec(int n,int t);//创建vector,元素个数为n,值均为t。
    vector<int> vec(vector&);//复制另一个vector。
    vector<int> vec(begin,end);//复制[begin,end)区间内另一个数组的元素到vector中。begin、end都是迭代器。尚且不明确能从哪些容器中进行复制。
    vector<vector<int>> vecdi;//二维数组。操作时注意行是否存在,再对行中元素进行操作。
    vector<vector<int>> vecdi = {{1,2,3},{4,5,6},{7,8,9}};//序列初始化。
    vector<vector<int>> vecdi(3,vector<int>(9));//3行9列,全为0。
    

    添加

    vec.push_back(x);//末尾添加元素x。
    vec.insert(iter,x);//迭代器iter指向元素前增加一个元素 x 。
    vec.insert(iter,n,x);//迭代器指向元素前增加 n 个相同元素 x 。
    vec.insert(iter,iter_first,iter_first);//迭代器指向元素前插入另一个相同类型向量的[iter_first,iter_first)间的数据。
    vecdi.push_back({});//二维数组添加一个空行。
    vecdi.push_back(vector<int>());//同上。
    

    遍历

    for(int i=0;i<vec.size();++i) cout<<vec[i];
    // 迭代器遍历,迭代器看作指针使用。
    for(vector<int>::iterator iter = vec.begin();iter!=vec.end();++iter)
        vec2.push_back(*iter);
    // auto代替迭代器,C++11标准。
    for(auto iter = vec.begin();iter!=vec.end();++iter)
        vec2.push_back(*iter);
    

    拷贝vector

        vector<int> vec2(vec);//初始化时拷贝。
        vec.assign(vec2.begin(),vec2.end());//利用assign函数拷贝。
        vec.assign(n,x);//将vector替换成 n 个元素 x ,之前内容清除。
        vec.insert(vec.end(),vec2.begin(),vec2.end());//用insert()函数向vec末尾提添加vec2。
        vec.swap(vec2);//交换两个vector。
        swap(vec[2],vec[5]);//将vec中的两个元素互换。
    

    assign()函数:string与vector

    assign()是头文件里的函数,一般用来复制字符串,在vector中同样能使用。百度百科在assign()词条的最小下面用简单的几行介绍了它在vector中的用法。而利用这个函数可以方便地实现string与vector之间的转换。

    #include<string>
    string str = "hello world";
    vector<char> vec(str.begin(),str.end());//vec={'h','e','l','l','o',' ','w','o','r','l','d'}
    string strc;
    strc.assign(vec.begin(),vec.end());//strc="hello world"
    string strcopy(vec.begin(),vec.end()-5);//strcopy = "holle "
    vec.assign(strcopy.begin(),strcopy.end());//vec={'h','e','l','l','o',' '}
    

    删除

    vector<int> vec = {1,2,3,4,5}
    cout<<*(vec.end()-1);//结果是最后的5。
    vec.pop_back();//删除5。
    cout<<*(vec.end());//这里不-1,会惊奇地发现此结果竟然是5!
    

    练习

    关于vector的使用可以用这些力扣题作为进阶练习:
    | 加一 |有效的数独 | 旋转图像 |


    [^2]: 参考baike.baidu.com/item/assign()/9716433?fr=aladdin
  • 相关阅读:
    全局比对与动态规划
    汉诺塔游戏的递归解析
    scikit-learn 多分类混淆矩阵
    Python argparse 子命令
    优雅的查看json文件
    Python数据结构和算法学习笔记4
    Python学习笔记29
    Python学习笔记28
    Python数据结构和算法学习笔记3
    Python数据结构和算法学习笔记2
  • 原文地址:https://www.cnblogs.com/foxer-z/p/12245218.html
Copyright © 2020-2023  润新知