zoukankan      html  css  js  c++  java
  • C++ STL基本容器的使用

    首先要理解什么是容器,在C++中容器被定义为:在数据存储上,有一种对象类型,它可以持有其它对象或指向其它对象的指针,这种对象类型就叫做容器。简单来说

    容器就是包含其他类的对象们的对象,当然这种(容器)对象中还包含了一系列处理其所包含对象以及要包含对象的处理。

    其次介绍一下STL,它由容器算法迭代器组成;

    STL可以实现方便容易的搜索数据或对数据排序等一系列的算法。

    STL 对定义的通用容器分三类:顺序性容器关联式容器容器适配器

    顺序容器:一种各元素之间有顺序关系的线性表,是一种线性结构的可序群集。顺序性容器中的每个元素均有固定的位置,除非用删除或插入的操作改变这个位置。

    这个位置和 元素本身无关,而和操作的时间和地点有关,顺序性容器不会根据元素的特点排序而是直接保存了元素操作时的逻辑顺序。比如我们一次性对一个顺序

    性容器追加三 个元素,这三个元素在容器中的相对位置和追加时的逻辑次序是一致的。

    关联容器:他和顺序容器不同关联容器是一种非线型的二叉树结构,各元素之间没有严格的物理顺序关系,也就是说元素在容器中并没有保存元素置 入容器先后的的逻辑顺序。但是关联式容器提供了另一种根据元素特点排序的功能,这样迭代器就能根据元素的特点“顺序地”获取元素。

    顺序容器中常用的主要有vector,list,deque等。

    容器适配器 :是一个比较抽象的概念, C++的 解释是:适配器是使一事物的行为类似于另一事物的行为的一种机制。容器适配器是让一种已存在的容器类型采用另一种不同的抽象类型的工作方式来实现的一种机 制。其实仅是发生了接口转换。那么你可以把它理解为容器的容器,它实质还是一个容器,只是他不依赖于具体的标准容器类型,可以理解是容器的模版。或者把它 理解为容器的接口,而适配器具体采用哪种容器类型去实现,在定义适配器的时候可以由你决定。

    为了定义一个容器类型的对象必须包含相关的头文件:

    1 定义vector:  #include <vector>
    2 定义list:    #include <list>
    3 定义deque:   #include <deque>
    4 定义queue:   #include <queue>
    5 定义stack:    #include <stack>  //注意:stack和queue都是基于deque实现的,但是stack和queue比较常用
    头文件包含
    1 vector<int>vec;//定义vector,常用
    2 list<int>lis;
    3 deque<int>deq;
    4 stack<int>sta;//定义栈,常用
    5 queue<int>que;//定义栈,常用
    定义示例

    顺序容器中vector最为常用,它表示一段连续的内存,基于数组实现:

    1     vector<int> vec1;    //默认初始化,vec1为空
    2 
    3     vector<int> vec2(vec1);  //使用vec1初始化vec2
    4 
    5     vector<int> vec3(vec1.begin(),vec1.end());//使用vec1初始化vec2
    6 
    7     vector<int> vec4(10);    //10个值为的元素
    8 
    9     vector<int> vec5(10,4);  //10个值为的元素
    Vector的定义和初始化
     1 //vector的定义
     2 vector                   创建一个空的vector。
     3 vector  c1(c2)           复制一个vector
     4 vector  c(n)             创建一个vector,含有n个数据,数据均已缺省构造产生
     5 vector  c(n, elem)      创建一个含有n个elem拷贝的vector
     6 vector  c(beg,end)       创建一个含有n个elem拷贝的vector
     7 
     8 //vector的操作
     9 c.assign(beg,end)        将[beg; end)区间中的数据赋值给c。
    10 c.assign(n,elem)      将n个elem的拷贝赋值给c。 
    11 c.at(idx)          传回索引idx所指的数据,如果idx越界,抛出out_of_range。
    12 c.back()                 传回最后一个数据,不检查这个数据是否存在。
    13 c.begin()           传回迭代器中的第一个数据地址。
    14 c.capacity()         返回容器中数据个数。
    15 c.clear()            移除容器中所有数据。
    16 c.empty()            判断容器是否为空。
    17 c.end()              指向迭代器中末端元素的下一个,指向一个不存在元素。
    18 c.erase(pos)         删除pos位置的数据,传回下一个数据的位置。
    19 c.erase(beg,end)       删除[beg,end)区间的数据,传回下一个数据的位置。
    20 c.front()            传回第一个数据。
    21 get_allocator        使用构造函数返回一个拷贝。
    22 c.insert(pos,elem)      在pos位置插入一个elem拷贝,传回新数据位置。
    23 c.max_size()            返回容器中最大数据的数量。
    24 c.insert(pos,n,elem)    在pos位置插入n个elem数据。无返回值。
    25 c.insert(pos,beg,end)   在pos位置插入在[beg,end)区间的数据。无返回值。 
    26 c.pop_back()           删除最后一个数据。
    27 c.push_back(elem)       在尾部加入一个数据。
    28 c.rbegin()             传回一个逆向队列的第一个数据。
    29 c.rend()               传回一个逆向队列的最后一个数据的下一个位置。
    30 c.resize(num)          重新指定队列的长度。
    31 c.reserve()            保留适当的容量。
    32 c.size()                返回容器中实际数据的个数。
    33 c1.swap(c2)
    34 swap(c1,c2)           将c1和c2元素互换。同上操作。
    35 operator[]            返回容器中指定位置的一个引用。
    vector容器的操作
     1  //3.遍历
     2 
     3     //下标法
     4 
     5     int length = vec1.size();
     6 
     7     for(int i=0;i<length;i++)
     8 
     9     {
    10 
    11        cout<<vec1[i];
    12 
    13     }
    14 
    15     cout<<endl<<endl;
    16 
    17     //迭代器法
    18 
    19     vector<int>::const_iterator iterator = vec1.begin();
    20 
    21     for(;iterator != vec1.end();iterator++)
    22 
    23     {
    24 
    25        cout<<*iterator;
    26 
    27     }
    Vector容器的遍历
  • 相关阅读:
    设计模式-抽象工厂模式
    设计模式-工厂方法模式
    设计模式-简单工厂模式
    设计模式-代理模式
    Retrofit原理学习
    Google Flutter的学习与使用
    Robolectric结合Android Studio的使用
    Android中app的启动步骤
    汽车系统实现--增加数据和删除数据
    vue--实现跑马灯效果
  • 原文地址:https://www.cnblogs.com/kpxy/p/9842953.html
Copyright © 2011-2022 走看看