• 序列式容器————vector


    目录

    介绍

    1 创建

    2 容量和大小

      size()

      capacity()

    3 resize()

    4 reverse()

    5 获取元素

      front()

      back()

    6 迭代器(待补充)

    7 push_back()

    8 emplace_back()

    9 emplace()(待补充)

    10 insert()

    11 clear()

    12 remove()

    13 pop_back()

    14 shrink_to_fit()

    15 erase()

    16 substr()

    介绍

    和 array<T,N> 容器相似,不同的是 vector<T> 容器的大小可以自动增长。在大多数时候,都可以用 vector<T> 代替数组存放元素。只要能够意识到,vector<T> 在扩展容量,以 及在序列内部删除或添加元素时会产生一些开销;但大多数情况下,代码不会明显变慢。

    为了使用 vector<T> 容器模板,需要在代码中包含头文件 vector。

    1 创建

    vector<int> a ;                                //声明一个int型向量a
    vector<int> a(10) ;                            //声明一个初始大小为10的向量
    vector<int> a(10, 1) ;                         //声明一个初始大小为10且初始值都为1的向量
    vector<int> b(a) ;                             //声明并用向量a初始化向量b
    vector<int> b(a.begin(), a.begin()+3) ;        //将a向量中从第0个到第2个(共3个)作为向量b的初始值

    数组的初始化:

    int n[] = {1, 2, 3, 4, 5} ;
    vector<int> a(n, n+5) ;              //将数组n的前5个元素作为向量a的初值
    vector<int> a(&n[1], &n[4]) ;        //将n[1] - n[4]范围内的元素作为向量a的初值

    2 容量和大小

    vector 的容量大小,是指在不分配更多内存的情况下可以保存的最多元素个数,vector 的大小是它实际所包含的元素个数,也就是有值的元素的个数。

     vector 的大小不能超出它的容董。当大小等于容量时,增加一个元素就会导致更多内存的分配。

    (1)size()

    返回大小,无符号整型值

    (2)capacity()

    返回容量,无符号整型值

    3 resize()

    改变容器大小。

    std::vector<int> values {1,2,3};
    values.resize (5);
    //把元素的个数变为参数指定的值,所以会增加两个用默认值初始化的元素。
    //如果添加了一个元素,导致超过当前容器的容景,容量会自动增加。
    
    values.resize (7, 99);
    //将容器大小设为7,并用99来初始化新增的元素
    //若7<原来的容器大小,那么就删除多余的元素

    4 reverse()

    改变容器容量(元素个数,整型)。

    5 获取元素

    使用下标索引[]

    (1)front

    返回第一个元素的引用

    (2)back

    返回最后一个元素的引用

    因为成员函数 front() 和 back() 返回的是引用,所以它们可以出现在赋值运算符的左边。

    values.front() = 2.71828;

    6 迭代器

    1 //全部输出
    2 vector<int>::iterator t ;
    3 for(t=a.begin(); t!=a.end(); t++)//t就是迭代器,表示元素位置,还可以前后移动
    4     cout<<*t<<" " ;//*t为指针的间接访问形式,是访问t指向的元素值

    7 push_back()

    8 emplace_back()

    emplace_back() 的参数正是添加到容器中的对象的构造函数所需要的参数。

    emplace_back() 用它的参数作为构造函数的参数,在容器中生成对象。如果不想使用移动运算,使用 push_back()。

    可以在 emplace_back() 函数中使用尽可能多的参数,只要它们满足对象构造函数的要求。这里有一个使用多参数的 emplace_back() 的示例:

    std::string str {"alleged"};
    words.emplace_back(str, 2, 3);
    //生成一个string对象(alleged的索引2开始的三个元素组成):leg,然后将leg添加到words字符串后面

    9 emplace()

    通过使用成员函数 emplace(),可以在 vector 序列中插入新的元素。对象会在容器中直接生成,而不是先单独生成对象,然后再把它作为参数传入。

    10 insert()

    11 clear()

    std::vector<int> data(100, 99);// Contains 100 elements initialized to 99
    data.clear(); // Remove all elements

    移除了所有的元素,因此大小变为 0,因为这个操作并没有改变容器的容量,所以容量还是 100。

    12 remove()

    remove() 算法由定义在 algorithm 头文件中的模板生成。

    vector<int>::iterator iter = std::remove(vec.begin(), vec.end(), val)

    只是把val移到vec的末尾,并不真正删除,真正删除还是要调用一次erase函数。返回新的end()值(非val部分的end),但传入的原vector的end并没有发生改变,因此size也就没有变化

    13 pop_back()

    14 shrink_to_fit()

    去掉容器中多余的容量,例如不再向容器中添加新元素。

    data.shrink_to_fit();

    15 erase()

    iterator erase(iterator position);
    
    iterator erase(iterator first, iterator last);

    删除掉某个位置position或一段区域(begin, end)中的元素,减少其size,返回被删除元素下一个元素的位置。

    一般remove和erase两者结合使用
    
    删除vector中值为x的元素:
    
    vec.erase(remove(vec.begin(),vec.end(),x),vec.end());

    16 substr()

    s.substr(pos,n)

    返回一个string,包含s中从pos开始的n个字符的拷贝(pos的默认值是0,n的默认值是s.size()-pos,即不加参数会默认拷贝整个s);

    补充:若pos的值超过了string的大小,则substr函数会抛出一个out_of_range异常;若pos+n的值超过了string的大小,则substr会调整n的值,只拷贝到string的末尾

  • 相关阅读:
    MIPS笔记
    花生壳动态域名解析工具原理
    SEE MIPS RUN 第六章 内存管理与TLB
    C/C++动态内存创建与内存管理
    ngclass 用法
    看了一个烟花的html作品 引用:http://www.w3cfuns.com/blog54440495404365.html
    ngclip angualr 的copy功能
    学习技术的方法
    restful restAPI 的定义方式
    我与计算机
  • 原文地址:https://www.cnblogs.com/pacino12134/p/11441882.html
Copyright © 2020-2023  润新知