C++的STL容器之顺序性容器vector、list、deque

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

顺序性容器:vector、list、deque

关联性容器:set、multiset、map、multimap

容器适配器:stack、queue、priority_queue

本篇主要总结顺序性容器:

(btw:获取迭代器的方法:建对象方式::iterator iter;  //例:vector::iterator iter;  )

1.vector

vector向量是一种顺序行容器。相当于数组,但其大小可以不预先指定,并且自动扩展。它可以像数组一样被操作,由于它的特性我们完全可以将vector 看作动态数组

当vector保存的数据量很大时,如果此时进行插入数据导致需要更大的空间来存放这些数据量,那么将会大大的影响程序运行的效率,所以我们应该合理的使用vector。

常用操作:

 (1)初始化vector对象的方式:

vector v1;     // 默认的初始化方式,内容为空

vector v2(v1);   // v2是v1的一个副本

vector v3(n, i)   // v3中包含了n个数值为i的元素

vector v4(n);   // v4中包含了n个元素,每个元素的值都是0

(2)vector常用函数

empty():判断向量是否为空,为空返回真,否则为假

begin():返回向量(数组)的首元素地址

end(): 返回向量(数组)的末元素的下一个元素的地址

clear():清空向量

front():返回得到向量的第一个元素的数据

back():返回得到向量的最后一个元素的数据

size():返回得到向量中元素的个数

push_back(数据):将数据插入到向量的尾部

pop_back():删除向量尾部的数据

at() 返回指定位置的元素

TYPE at( size_type loc );//差不多等同v[i];但比v[i]安全;

erase() 删除指定元素:例:vec.erase(vec.begin()+i,vec.begin()+j);删除区间[i,j-1];区间从0开始


assign函数:

void assign(const_iterator first,const_iterator last);

void assign(size_type n,const T& x = T());

功能:将区间[first,last)的元素赋值到当前的vector容器中,或者赋n个值为x的元素到vector容器中,这个容器会清除掉vector容器中以前的内容。



2.list 链表

链表相对于vector向量来说的优点在于:(a)动态的分配内存,当需要添加数据的时候不会像vector那样,先将现有的内存空间释放,在次分配更大的空间,这样的话

效率就比较低了。(b)支持内部插入、头部插入和尾部插入

缺点:不能随机访问,不支持[]方式和vector.at()、占用的内存会多于vector(非有效数据占用的内存空间)

(1)初始化list对象的方式

list L0;    //空链表

list L1(3);   //建一个含三个默认值是0的元素的链表

list L2(5,2); //建一个含五个元素的链表,值都是2

list L3(L2); //L3是L2的副本

list L4(L1.begin(),L1.end());    //L4含L1一个区域的元素[begin, end]。

(2)list常用函数

begin():返回list容器的第一个元素的地址

end():返回list容器的最后一个元素之后的地址

rbegin():返回逆向链表的第一个元素的地址(也就是最后一个元素的地址)

rend():返回逆向链表的最后一个元素之后的地址(也就是第一个元素再往前的位置)

front():返回链表中第一个数据值

back():返回链表中最后一个数据值

empty():判断链表是否为空

size():返回链表容器的元素个数

clear():清除容器中所有元素

insert(pos,num):将数据num插入到pos位置处(pos是一个地址)

insert(pos,n,num):在pos位置处插入n个元素num

erase(pos):删除pos位置处的元素

push_back(num):在链表尾部插入数据num

pop_back():删除链表尾部的元素

push_front(num):在链表头部插入数据num

pop_front():删除链表头部的元素

sort():将链表排序,默认升序

(3)遍历方式

双向链表list支持使用迭代器正向的遍历,也支持迭代器逆向的遍历,但是不能使用 [] 索引的方式进行遍历。


3.deque 双端队列

 (1)初始化deque对象的方式:

deque c   ;  //产生一个空的deque,其中没有任何元素

deque c1(c2); //产生另一个同型deque的副本(所有元素都被拷贝)

deque c(n) ;  //产生一个大小为n的deque

deque c(n , elem) ;  //产生一个大小为n的deque,

                           //每个元素值都是elem。

dequer c(begin,end); //产生一个deque,以区间[begin ; end]

                           //做为元素初值

析构函数:

c.~ deque()   ;销毁所有元素,并释放内存。

(2)deque常用函数

非变动性操作

c.size();         //返回当前的元素数量

c.empty();       //判断大小是否为零。等同于c.size() == 0,但可能更快

c.max_size();    //可容纳元素的最大数量

c.at(idx) ;       //返回索引为idx所标示的元素。如果idx越界,抛出out_of_range

c[idx] ;         //返回索引idx所标示的元素。不进行范围检查

c.front() ;       //返回第一个元素,不检查元素是否存在

c.back();        //返回最后一个元素

c.begin();       //返回一个随机迭代器,指向第一个元素

c.end();         //返回一个随机迭代器,指向最后元素的下一位置

变动性操作:

c1 = c2  ;        //将c2的所有元素赋值给c1;

c.assign(n , elem);    //将n个elem副本赋值给c

c.assing(beg , end);   //将区间[beg;end]中的元素赋值给c;

c.push_back(elem);   //在尾部添加元素elem

c.pop_back()    ;    //移除最后一个元素(但不回传)

c.push_front()   ;   //在头部添加元素elem

c.pop_front()    ;   //移除头部一个元素(但不回传)

c.erase(pos)    ;   //移除pos位置上的元素,返回一元素位置

                  //如 c.erase( c.begin() + 5)  //移除第五个元素

c.insert(pos , elem); //在pos位置插入一个元素elem,并返回新元素的位置

c.insert(pos , n , elem); //在pos位置插入n个元素elem,无返回值

c.insert(pos , beg , end);

c.resize(num);       //将容器大小改为num。可更大或更小。

c.resize(num , elem);  //将容器大小改为num,新增元素都为 elem

c.clear();            //移除所有元素,将容器清空

PS:Deque和Vector是智能容器,删除或者增加元素时,其他位置与元素会进行相应的移动。

最好采用deque的情形:

1、需要在两端插入和删除元素。

2、无需引用容器内的元素。

3、要求容器释放不再使用的元素。

deque的各项操作只有一下两点和vector不同:

deque不提供容量操作:capacity()reverse()

deque直接提供函数完成首尾元素的插入和删除。

其他均与vector相同。

注意:

1、除了at()函数,其他成员函数都不会检查索引或迭代器是否有效。

2、元素的插入和删除可能会导致内存重新分配。所以任何插入或删除操作都会使所有指向deque元素的pointers、reference、iterators失效。唯一例外的是在首尾插入元素之后,pointers和reference可能仍然有效。


第二篇:C++的STL容器之关联性容器set、multiset、map、multimap

链接:https://mp.csdn.net/postedit/79720237

第三篇:C++的STL容器之关联性容器stack、queue、priority_queue

链接: https://blog.csdn.net/baodream/article/details/79732680

你可能感兴趣的:(C++,STL库)