天天看点

C++顺序容器vector,deque,list

容器即可以包含各种的数据形式的结构类,c++ stl中可以理解为存放其他对象的对象,在c++标准库中有许多容器类型,包括顺序容器和关联容器,这里介绍几种顺序容器的基本操作和应用;

1、这里先介绍标准容器定义的运算符:

C++顺序容器vector,deque,list

这里a ,b 为容器实例。

2、所有容器的迭代器访问接口

C++顺序容器vector,deque,list

3、其他的一些通用访问接口

C++顺序容器vector,deque,list

4、介绍完了一般容器的接口外,这里再详细说明顺序容器的接口,顺序容器一般接口

C++顺序容器vector,deque,list

5、顺序容器其他接口,与所支持的容器类型有关

C++顺序容器vector,deque,list

6、迭代器及最大值最小值

  各容器都有相应的迭代器iterator,一般用于指向容器中的成员,类似于指针。一般使用a.begin()来获取容器a的开始迭代器,其指向a中第一个元素,a.end()来获取容器a的末尾迭代器,不指向任何数据,迭代器可以通过加减整数值来移动位置,指向容器中的任意元素。

  vector:: iterator it; //it可以读写vector的元素;

  string:: iterator it; //it可以读写string中的字符;

  vector::const_iterator it; //it只能读元素,不能写;

  string::const_iterator it; //it只能读元素,不能写;

  虽然string不是容器,但是这里也可以使用迭代器,vector,string等可以使用下标进行元素访问,而有些容器就只能使用迭代器来访问数据了;

  迭代器it指向的数据为(*it)。

  在C++中有两个函数可以获取容器中一段范围内的最大值和最小值分别为:iterator max_element(iterator i, iterator j) ;iterator min_element(iterator i, iterator j)定义在文件algorithm中,返回值也是一个迭代器,输入为两个迭代器边界[i, j)。

7、向量vector

在C++11中vector可以利用集合数来直接初始化:vector v{1,2,4};此功能只能在VS2012以上中才被完全支持。上面介绍了一些相关的接口操作和函数,这里先对vector进行相关练习测试:

#include <iostream>
#include <vector>
using namespace std;

int main()
{
    int a[] = {,,,,,};
    vector<int> vec1,vec2,vec3;  //较少有直接赋值的,与数组不一样,int可以是其他基本数据类型,也可以其他自己定义的类型结构
    for(int i = ; i< ; i++)
    {
        //vec1[i] = a[i];      没有分配内存空间,不能这样用
        vec1.push_back(a[i]);
        vec2.push_back(a[-i]) ;    
    }
    vec3 = vec2;//赋值

    vec1.insert(vec1.begin()+,);    //第二个位置插入10
    vec1.erase(vec1.begin()+);        //第四个位置删除
    vec2.pop_back();                   //末尾数删除
    vec2.push_back();                //末尾添加10

    cout << "vec3 size:" << vec3.size() << endl;
    cout << "vec3 Max_size:" << vec3.max_size() << endl;
    cout << "vec3 front:" << vec3.front() << endl;
    cout << "vec3 back:" << vec3.back() << endl;
    cout << "\nvec1:" ;
    for(int i = ; i < vec1.size(); i++)
        cout << "      " << vec1[i] ;
    cout << "\nvec2:" ;
    for(int i = ; i < vec2.size(); i++)
        cout << "      " << vec2[i] ;
    cout << "\nvec3:" ;
    for(int i = ; i < vec3.size(); i++)
        cout << "      " << vec3[i] ;
    return ;
}
           

测试结果:

C++顺序容器vector,deque,list

8、双端队列,与向量差不多,具有相似的方法

#include <iostream>
#include <deque>
using namespace std;

int main()
{
    deque<int> deq1,deq2,deq3;
    int a[] = {,,,,,};
    for(int i = ; i < ; i++)
        deq1.push_back(a[i]);
    deq2 = deq3 = deq1;    //赋值
    deq1.insert(deq1.begin()+,);
    deq1.erase(deq1.end()-);

    deq2.pop_back();
    deq2.push_back();

    deq3.pop_front();    //双向队列新加
    deq3.push_front();

    cout << "\ndeq1:" ;
    for(int i = ; i < deq1.size(); i++)
        cout << deq1.at(i) << "     " ;
    cout << "\ndeq2:" ;
    for(int i = ; i < deq2.size(); i++)
        cout << deq2.at(i) << "     ";
    cout << "\ndeq3:" ;
    for(int i = ; i < deq3.size(); i++)
        cout << deq3[i] << "     ";
    return ;
}
           

测试结果:

C++顺序容器vector,deque,list

9、列表,list与前面两个有点不一样,不能通过下标访问元素,其迭代器也不支持数字运算(+ - =),具有remove(),splice()等功能函数;

#include <iostream>
#include <list>
using namespace std;

void display(list<int>listn)  //list输出函数
{
    if(!listn.empty())
    {
        list<int>::iterator i;
        for(i = listn.begin(); i != listn.end(); i++)
            cout << "     " << *i;
        cout << endl;
    }
    else
        cout << "     NUll LIST!";
}

int main()
{
    list<int> list1,list2,list3,list4,list5,list6;
    int a[] = {,,,,,};
    for(int i = ; i < ; i++)      //不支持下标访问
    {
        list1.push_back(a[i]);
        list2.insert(list2.begin(),,);
        list3.push_front(a[i]);
    }

    list4 = list5 = list6 = list1;

    list1.remove();    //删除第三个数

    list<int>::iterator it1 = list4.begin();
    //list 不支持iterator 的代数运算+ = 等
    advance(it1,);         //前进3个
    list4.insert(it1,);

    list<int>::iterator it2 = list5.begin();
    advance(it2,);
    list5.splice(it2,list6);   //list6连接到list5的it2位置,list6删除

    cout <<"list1:";
    display(list1);
    cout <<"list2:";
    display(list2);
    cout <<"list3:";
    display(list3);
    cout <<"list4:";
    display(list4);
    cout <<"list5:";
    display(list5);
    cout <<"list6:";
    display(list6);

    return ;
}
           

测试结果:

C++顺序容器vector,deque,list

10、array

  数组array也是一种顺序容器,array 定义的时候必须定义数组的元素个数:

array<int, 4> a = {1,2,3,4};

  array的应用与其他的容器差不多,只不过array不能再添加或删除元素。

继续阅读