C++顺序容器

Posted hntea-hong

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++顺序容器相关的知识,希望对你有一定的参考价值。

C++顺序容器

October 27, 2016 3:09 PM

容器的概念

  容器容纳特定类型对象集合;也可以这么理解:容器是一种数据结构,如list,vector,和deques ,以模板类的方法提供。为了访问容器中的数据,可以使用由容器类输出的迭代器。

适配器

  适配器是根据原始的容器类型来提供操作,通过定义新的操作接口,来适应基础的容器类型;换句话说就是适配器让容器拥有像操作栈、队列等特有的操作接口。顺序容器适配器包括:

  • stack:后进先出栈(LIFO)

  • queue:先进先出队列

  • priority_queue:有优先级管理的队列

迭代器

  迭代器是一种检查容器内元素并遍历元素的数据类型;标准库中每一种容器都定义了相应的迭代器类型,各种容器都定义了一个名为 interator 的成员,使用:vector<int>::interator iter

  迭代器提供了访问容器中对象的方法;例如,可以使用一对迭代器指定list或vector中的一定范围的对象。迭代器就如同一个指针。事实上,C++的指针也是一种迭代器。但是,迭代器也可以是那些定义了operator*()以及其他类似于指针的操作符地方法的类对象。

  迭代器有各种不同的创建方法。程序可能把迭代器作为一个变量创建。一个STL容器类可能为了使用一个特定类型的数据而创建一个迭代器。作为指针,必须能够使用*操作符类获取数据。你还可以使用其他数学操作符如++。典型的,++操作符用来递增迭代器,以访问容器中的下一个对象。如果迭代器到达了容器中的最后一个元素的后面,则迭代器变成past-the-end值。使用一个past-the-end值得指针来访问对象是非法的,就好像使用NULL或为初始化的指针一样。

标准库中的顺序容器

  将单一类型元素聚集起来成为容器,让后根据位置来存储和访问这写元素,这就是顺序容器。标准库中的顺序容器有:

  • vector
  • list
  • deque(是双端队列”double-ended queue”)

注意:容器只是定义了少量操作,大多数额外操作由算法库提供

头文件
#include <vector>
#include <list>
#include <deque>

注意:所有容器都是类模板,使用如下形式:vector<string> svec


容器元素初始化

C<T> c:
创建一个名为c的空容器。C:容器类型,T:元素类型。适用于所有容器

C c(c2):
创建容器c2的副本c,c与c2必须具有相同类型,并存放相同的元素。适用于所有容器

C c(b,e):
创建c ,元素是迭代器b和e标示的范围内元素的副本。适用于所有容器。

C c(n,t):
用于n个值为t的元素创建容器c,其中t必须是容器类型C元素类型的值,只适用于顺序容器

C c(n):
创建n个值的容器,只适用于顺序容器

使用示例:初始化一个含有 64 个 aaa 字符的列表

const list<int>::size_type list_size = 64;
list<string> slist(list_size,"aaa");
容器内元素的特殊要求
  1. 元素类型必须支持赋值运算
  2. 元素类型的对象必须可以复制

容器操作的特殊要求:
- 一种是需要外加类型要求的容器操作是指定容器大小并提供单个初始化样式的构造函数
- 使用容器自身的迭代器进行操作。

容器操作例子

class SequenceContainer
public:
    SequenceContainer()
    ~SequenceContainer()

    //初始化例子
    void SeqConInit()
        string s[5] = 
            "x",
            "xx",
            "xxx",
            "xxxx"
        ;
        list_size = 64;
        //如果想在成员变量中申明
        list<string> slist(list_size,"aaa");
    

    //使用vector,并使用下标访问
    void usingVector()
        //定义初始化
        vector<int> ivec1;      //创建一个空的int类型容器
        vector<int> ivec2(ivec1);   //复制ivc1
        vector<int>ivec3(10,-1);    //创建10个元素值为-1的容器
        vector<string>ssvec(10,"!hi");

         //操作
        if (ivec1.empty())
            cout<<"这是一个空容器"<<endl;
        
        cout<<"容器中的数目:"<<ivec3.size()<<endl;
        //在末尾添加一个元素
        ssvec.push_back("hello");
        for(int i=0;i<ssvec.size();i++)
            //弹出不要的元素
           ssvec.pop_back();
          //返回容器中的元素,访问方式和数组一样
           cout<<ssvec[i]<<endl;
        
        cout<<"添加元素后的容器数目:"<<ssvec.size()<<endl;
    

    //使用迭代器iterator 访问容器
    void usingIterator()
        //创建容器
        vector<string> ssvec(5,"Hntea");
        //创建迭代器
        vector<string>::iterator siter;

        //初始化迭代器指向;指向第一个元素
        siter = ssvec.begin();
        //返回逆序迭代器
        //siter = ssvec.rbegin();

        //访问迭代器所指向的内容时使用 *; 这和指针差不多
        for(int i=0;i<ssvec.size();i++)
            cout<<*siter<<endl;
            siter++;
        
    

    //容器大小操作
    void usingSizeOpt()
        //创建容器
        vector<string> ssvec(5,"Hntea");
        //清空容器
        ssvec.empty();
        //从新定义长度12
        ssvec.resize(12);
        //插入元素
        ssvec.insert(ssvec.begin(),10,"hntea");
    
private:
    //定义容器类型
    vector<string> svec;
    list<int> ilist;
    list<int>::size_type list_size;

    deque<char> items;
;

选择容器的提示

  • 如果程序要求随机访问元素,则应该使用vector和deque容器
  • 如果程序必须在容器的中间位置插入或删除元素,则应该采用list容器
  • 如果程序不是在容器的中间位置,而是在容器首部或尾部插入或删除元素,则应该采用deque容器
  • 如果只需在读取输入时在容器的中间位置插入元素,然后需要随机访问元素,则可考虑在输入时将元素读入到list容器中,接着对容器从新排序,使其适合顺序访问,然后将排序后的list容器复制到一个vector容器。

以上是关于C++顺序容器的主要内容,如果未能解决你的问题,请参考以下文章

C++提高编程C++全栈体系(二十七)

C++ std :: fill()函数

容器迭代器

c++顺序容器

C++中list的用法总结

C++顺序容器知识总结