STL的vector

  本篇文章之所以诞生,是由于在刷PAT时需要掌握STL模板库,所以特意测试学习了常用的方法。仅适用于G++环境下的单线程单文档情况。对于多文档多线程情况不保证正确性。如果你是只想在数据结构与算法比赛中多拿一些AC而学习STL,小码农自认它还是挺好的。如果是项目需要而学习STL,还是建议读官方文档。
  如果你觉得博文状态下阅读费劲,可以去我的github下载源码。如果出现对不齐的情况,把编辑器Tab键缩进设置成4个就可以了。欢迎指点评论。

#include <bits/stdc++.h>
using namespace std;
/*
    下面的注释: 
        1)DT : data type 
        2)遍历说明:以集合名开头的都是遍历本次测试使用到的集合的结果,
                    由于太多cout会使调理不清晰,便直接放上输出结果。 
*/
bool cmp(int e1, int e2){ return e1 > e2; }
int main()
{
    /*
        1、创建:
            1)默认创建:                                 vector<DT> v1;
            2)创建时初始化大小为n:                           vector<DT> v2(n);
                测试得到的初始值:                   int -> 0;           char -> 0(ASCII); 
                                                    double -> 0;        float -> 0; 
                                                    string -> "";       bool -> false;
            3)创建时初始化大小为n,数据初始值为m:           vector<DT> v3(n, m);
            4)创建一个vector的拷贝:                        vector<DT> v4(ano);
            5)创建一个拷贝指定区间的vector:                vector<DT> v4(iterator it1, iterator it2);
                迭代器类似一个游标,首位置在首元素之前,尾位置在尾元素之后,
                每次移动将游标移至两元素之间。取出迭代器之后紧邻的元素使用 *,如 *it
    */
    vector<int> v1;
    vector<int> v2(10);
    vector<int> v3(10, 4);
    vector<int> v4(v3);
    vector<int> v5(v3.begin(), v3.end());

    /*
        2、基础操作(最最常用的操作):
            向尾部插入:                                      void push_back(data);
            弹出最后一个元素:                                   void pop_back();
            vector中数据的个数:                               int size();
                 1)有多少就是多少,不管用没用,都会被计入size中。
                 1)比如第二种初始化方式,初始化之后的size就是传入的参数 
            取出指定位置的元素:                              DT at[index];           DT operator[index];
    */
    v1.push_back(1);
    /*Console:          v1: 1
                        v2: 0 0 0 0 0 0 0 0 0 0
                        v3: 4 4 4 4 4 4 4 4 4 4
                        v4: 4 4 4 4 4 4 4 4 4 4
                        v5: 4 4 4 4 4 4 4 4 4 4                 */
    v1.pop_back();
    v2.pop_back();
    /*Console:          v1:                                     
                        v2: 0 0 0 0 0 0 0 0 0                   */

    /*
        3、获取: 
            获取指定位置的元素:                                  DT at[index];   DT operator[index];
            获得首元素位置之前的迭代器:                          vector<DT>::iterator begin(); 
            获得尾元素位置之后的迭代器:                          vector<DT>::iterator end();
            获得头元素的拷贝:                                       DT front(); 
            获得尾元素的拷贝:                                       DT back(); 
    */
    for(int i = 0; i < 10; i++)
        v1.push_back(i);
    vector<int>::iterator itb3 =  v1.begin();
    vector<int>::iterator ite3 =  v1.end();
    int f = v1.front();
    int b = v1.back(); 
    cout << *itb3 << " " << *ite3 << " " << f << " " << b << endl;
    /*Console:          0 0 0 9                                     */

    /*
        4、遍历:
            直接遍历:                           for(int i = 0; i < v.size(); i++)
            迭代器遍历:                      for(vector<DT>::iterator it = v.begin(); it != v.end(); it++)
                1)可以对迭代器直接使用++和--,使游标向后或向前移动一位 
    */
    for(int i = 0; i < v1.size(); i++)
        cout << v1[i] << " ";
    cout << endl;
    for(vector<int>::iterator it = v1.begin(); it != v1.end(); it++)
        cout << *it << " ";
    cout << endl;
    /*Console:          v1: 0 1 2 3 4 5 6 7 8 9
                        v1: 0 1 2 3 4 5 6 7 8 9                                 */

    /*
        5、插入:
            插入到此vector最尾:                                   void push_back(DT data);
            向迭代器现在指向的位置和后面紧邻的位置之间插入一个x:     iterator insert(iterator it, DT x);
            向迭代器现在指向的位置和后面紧邻的位置之间插入n个x:     iterator insert(iterator it, int n, DT x);  
    */
    vector<int>::iterator itb5 =  v1.begin();
    v1.insert(itb5, 99);
    v1.insert(itb5, 100); 
    vector<int>::iterator ite5 =  v1.end();
    v1.insert(ite5, 999);
    v1.insert(ite5, 9999);
    /*Console:          v1: 99 100 0 1 2 3 4 5 6 7 8 9 9999 999                     */
    itb5++;
    v1.insert(itb5, 4, 98); 
    /*Console:          v1: 100 98 98 98 98 99 0 1 2 3 4 5 6 7 8 9 9999 999         */

    /*
        6、删除:
            删除最后一个元素:                                       void pop_back();
            删除迭代器游标之后紧邻的元素:                         iterator erase(iterator it);
                1)迭代器游标已指向尾元素之后时运行时会出错 
            清空向量中所有元素:                                  void clear(); 
    */
    vector<int>::iterator itb6 = v1.begin();
    v1.pop_back();
    v1.erase(itb6);
    v2.clear();
    /*Console:              v2: 
                            v1: 98 98 98 98 99 0 1 2 3 4 5 6 7 8 9 9999         */

    /*
        7、修改:
            把vector设置成 n个 x:                                    void assign(int n, DT x);
            交换两个同类型vector:                                  void swap(vector&);
    */
    v2.assign(8, 100);
    v2.swap(v3);
    /*Console:              v2: 4 4 4 4 4 4 4 4 4 4
                            v3: 100 100 100 100 100 100 100 100     */

    /*
        8、排序:
             使用sort()函数:                                        sort(v.begin(), v.end());
             需要自定义时传入比较函数:                              cmp(DT e1, DT e2); 
    */                                              
    sort(v1.begin(), v1.end());
    /*Console:  v1: 0 1 2 3 4 5 6 7 8 9 98 98 98 98 99 9999 */
    sort(v1.begin(), v1.end(), cmp);
    /*Console:  v1: 9999 99 98 98 98 98 9 8 7 6 5 4 3 2 1 0 */

    /*
        9、二维数组:
            vector<vector<int> >
                1)内部的vector<int>之后一定要有个space。不然会编译错误 
    */
    vector<vector<int> > vv;
    vv.push_back(v1);
    vv.push_back(v2);
    /*Console:      vv: 9999 99 98 98 98 98 9 8 7 6 5 4 3 2 1 0
                        4 4 4 4 4 4 4 4 4 4                                                 */

    /*
        10、其他:
            判断是否为空:                                 bool empty();
            反转vector中的元素:                           reverse(v.begin(), v.end()); 
    */
    cout << v1.empty() << endl;
    reverse(v1.begin(), v1.end());
    /*Console:                  0 
                                v1: 0 1 2 3 4 5 6 7 8 9 98 98 98 98 99 9999                     */

    /*
        11、补充:
            创第5个构造函数中可以传入数组的一部分([begin, end)) :vector<int> v(&begin, &end);  
    */
    int arr[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    vector<int> v11(&arr[3], &arr[8]);
    /*Console:                  4 5 6 7 8                   */
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值