C++容器-2顺序容器vector、list、deque的使用

C++容器之顺序容器vector、list、deque的使用


1vector(向量)的使用

内部数据结构:数组

随机访问每个元素,所需要的时间为常量。

在末尾增加或删除元素所需时间与元素数目无关,在中间或开头增加或删除元素所需时间随元素数目呈线性变化。

可动态增加或减少元素,内存管理自动完成,但程序员可以使用reserve()成员函数来管理内存。

vector的迭代器在内存重新分配时将失效(它所指向的元素在该操作的前后不再相同)。当把超过capacity()-size()个元素插入vector中时,内存会重新分配,所有的迭代器都将失效;否则,指向当前元素以后的任何元素的迭代器都将失效。当删除元素时,指向被删除元素以后的任何元素的迭代器都将失效。

//头文件

#include<vector>

//1.定义和初始化

    vector<int> vec1;    //默认初始化,vec1为空

     vector<int> vec2(vec1);  //使用vec1初始化vec2

     vector<int> vec3(vec1.begin(),vec1.end());//使用vec1初始化vec2

     vector<int> vec4(10);    //10个值为的元素

    vector<int> vec5(10,4);  //10个值为的元素

vector<vector<int>> testarray(3);//3*3的二维数组

vector<vector<int>> array(R,vector<int>(C));//每组数据都是RC列的二维数组

 

//2.常用操作方法

     vec1.push_back(100);            //添加元素

     int size = vec1.size();         //元素个数

     bool isEmpty = vec1.empty();    //判断是否为空

    cout<<vec1[0]<<endl;        //取得第一个元素

vec1.insert(vec1.end(),5,3);    //vec1.back位置插入个值为的元素

vec1[0]=200;       //对第0位赋值

Testarray[i][j]=0;//对第ij列赋值

     vec1.pop_back();              //删除末尾元素

     vec1.erase(vec1.begin(),vec1.end());//删除之间的元素,其他元素前移

     cout<<(vec1==vec2)?true:false;  //判断是否相等==、!=>=<=...

     vector<int>::iterator iter = vec1.begin();    //获取迭代器首地址

     vector<int>::const_iterator c_iter = vec1.begin();   //获取const类型迭代器

     vec1.clear();                 //清空元素

 

//3.遍历

    //下标法

     int length = vec1.size();

     for(int i=0;i<length;i++)

     {

        cout<<vec1[i];

     }

     cout<<endl<<endl;

    //迭代器法

    vector<int>::const_iterator iterator = vec1.begin();

    for(;iterator != vec1.end();iterator++)

    {

       cout<<*iterator;

    }

 

//4.常用成员函数

1.push_back   在数组的最后添加一个数据

2.pop_back    去掉数组的最后一个数据

3.at                得到编号位置的数据

4.begin           得到数组头的指针

5.end             得到数组的最后一个单元+1的指针

6front        得到数组头的引用

7.back            得到数组的最后一个单元的引用

8.max_size     得到vector最大可以是多大

9.capacity       当前vector分配的大小

10.size           当前使用数据的大小

11.resize         改变当前使用数据的大小,如果它比当前使用的大,者填充默认值

12.reserve      改变当前vecotr所分配空间的大小

13.erase         删除指针指向的数据项

14.clear          清空当前的vector

15.rbegin        vector反转后的开始指针返回(其实就是原来的end-1)

16.rend          vector反转构的结束指针返回(其实就是原来的begin-1)

17.empty        判断vector是否为空

18.swap         与另一个vector交换数据

 

//5.vector的其他成员函数

c.assign(beg,end):将[beg; end)区间中的数据赋值给c

        c.assign(n,elem):将nelem的拷贝赋值给c

        c.at(idx):传回索引idx所指的数据,如果idx越界,抛出out_of_range

        c.back():传回最后一个数据,不检查这个数据是否存在。

        c.front():传回地一个数据。

        get_allocator:使用构造函数返回一个拷贝。

        c.rbegin():传回一个逆向队列的第一个数据。

        c.rend():传回一个逆向队列的最后一个数据的下一个位置。

        c.~ vector <Elem>():销毁所有数据,释放内存。

 

2list(双向链表)使用

Liststl实现的双向链表,list表示非连续的内存,基于链表实现,与向量(vectors)相比,它允许快速的插入和删除,但是随机访问却比较慢。需要添加头文件#include <list>

内部数据结构:双向环状链表。

不能随机访问一个元素。

可双向遍历。

在开头、末尾和中间任何地方增加或删除元素所需时间都为常量。

可动态增加或减少元素,内存管理自动完成。

增加任何元素都不会使迭代器失效。删除元素时,除了指向当前被删除元素的迭代器外,其它迭代器都不会失效。

//1.定义和初始化

    list<int> lst1;          //创建空list

    list<int> lst2(3);       //创建含有三个元素的list

    list<int> lst3(3,2); //创建含有三个元素的list

    list<int> lst4(lst2);    //使用lst2初始化lst4

    list<int> lst5(lst2.begin(),lst2.end());  //lst4

 

//2.常用操作方法

    lst1.assign(lst2.begin(),lst2.end());  //分配值

    lst1.push_back(10);                    //添加值

    lst1.pop_back();                   //删除末尾值

    lst1.begin();                      //返回首值的迭代器

    lst1.end();                            //返回尾值的迭代器

    lst1.clear();                      //清空值

    bool isEmpty1 = lst1.empty();          //判断为空

    lst1.erase(lst1.begin(),lst1.end());                        //删除元素

    lst1.front();                      //返回第一个元素的引用

    lst1.back();                       //返回最后一个元素的引用

    lst1.insert(lst1.begin(),3,2);         //从指定位置插入个

    lst1.rbegin();                         //返回第一个元素的前向指针

    lst1.remove(2);                        //相同的元素全部删除

    lst1.reverse();                        //反转

    lst1.size();                       //含有元素个数

    lst1.sort();                       //排序

    lst1.unique();                         //删除相邻重复元素

 

//3.遍历

    //迭代器法

    for(list<int>::const_iterator iter = lst1.begin();iter != lst1.end();iter++)

    {

       cout<<*iter;

    }

    cout<<endl;

 

3deque双向队列)使用

deque容器类与vector类似,而是采用多个连续的存储块,支持随机访问和快速插入删除,它在容器中某一位置上的操作所花费的是线性时间。与vector不同的是,deque还支持从开始端插入数据:push_front()。其余类似vector操作方法的使用。deque是对vectorlist 优缺点的结合,它是处于两者之间的一种容器。

//头文件

#include <deque>

1.Constructors 创建一个新双向队列

      deque();//创建一个空双向队列

      deque( size_type size );// 创建一个大小为size的双向队列

      deque( size_type num, const TYPE &val ); //放置numval的拷贝到队列中

      deque( const deque &from );// from创建一个内容一样的双向队列

      deque( input_iterator start, input_iterator end );

      // start end - 创建一个队列,保存从startend的元素。

2.Operators 比较和赋值双向队列

      //可以使用[]操作符访问双向队列中单个的元素

3.assign() 设置双向队列的值

   语法:

      void assign( input_iterator start, input_iterator end);//startend指示的范围为双向队列赋值

      void assign( Size num, const TYPE &val );//设置成numval

4.at() 返回指定的元素

      reference at( size_type pos ); 返回一个引用,指向双向队列中位置pos上的元素

5.back() 返回最后一个元素

      reference back();//返回一个引用,指向双向队列中最后一个元素

6.begin() 返回指向第一个元素的迭代器

      iterator begin();//返回一个迭代器,指向双向队列的第一个元素

7.clear() 删除所有元素

8.empty() 返回真如果双向队列为空

9.end() 返回指向尾部的迭代器

10.erase() 删除一个元素

      iterator erase( iterator pos ); //删除pos位置上的元素

      iterator erase( iterator start, iterator end ); //删除startend之间的所有元素//返回指向被删除元素的后一个元素

11.front() 返回第一个元素的引用

12.get_allocator() 返回双向队列的配置器

13.insert() 插入一个元素到双向队列中

      iterator insert( iterator pos, size_type num, const TYPE &val ); //pos前插入numval

      void insert( iterator pos, input_iterator start, input_iterator end ); //插入从startend范围内的元素到pos前面

14.max_size() 返回双向队列能容纳的最大元素个数

15.pop_back() 删除尾部的元素

16.pop_front() 删除头部的元素

17.push_back() 在尾部加入一个元素

18.push_front() 在头部加入一个元素

19.rbegin() 返回指向尾部的逆向迭代器

20.rend() 返回指向头部的逆向迭代器

21.resize() 改变双向队列的大小

22.size() 返回双向队列中元素的个数

23.swap() 和另一个双向队列交换元素

      void swap( deque &target );// 交换target和现双向队列中元素

 

 参考博客:

http://blog.csdn.net/acosoft/article/details/4395468

http://blog.csdn.net/conanswp/article/details/23297441


 

猜你喜欢

转载自blog.csdn.net/alan_1550587588/article/details/77976591