STL顺序容器总结

顺序容器总结:

array:固定大小的数组,支持快速访问,不能添加和删除元素

vector:动态数组,支持快速访问,但在尾部之外插入或删除元素会很慢

string:vector相似的容器,用于保存字符

deque:双向队列,支持快速随机访问,在头尾位置插入元素速度很快

list:双向链表,支持双向访问,在链表任何位置插入和删除元素都很快

forward_list:单向链表,只支持单向访问,在链表任何位置插入和删除元素都很快

 

 

1.插入元素(除array外,因为array中数据是固定的):

push_back(x)

empalce_back(x)  在容器尾部插入一个元素x,返回void     

push_front(x)

empalce_front(x)  在容器头部插入一个元素x,返回void

insert(p,x)      

emplace(p,x)     在迭代器p之前插入x,返回指向新添加元素的 迭代器

insert(p,n,t)   在迭代器p之前插入n个元素,值为t,返回指向第一个新添加元素的迭代器 

insert(p,b,e)  在迭代器p之前插入迭代器b,e之间的元素,返回指向第一个新添加元素的迭代器

insert(p,li) 在迭代器p之前插入花括号包围的元素列表,返回指向第一个新添加元素的迭代器

 

 

可以注意到:pushemplace都可以插入到容器中,这两个函数的区别是什么呢?

当调用push成员函数时,将元素类型的对象传给形参,这些类型被拷贝到容器中,而emplace成员函数是自己在容器内存空间中构造元素。

比如(idname分别是某一对象构造函数的参数)

C.emplace_back(“id”,”name”);  正确:它可以直接调用对象的构造函数来实例化元素

C.push_back(“id”,”name”);   错误:不可以调用构造函数

 

2.访问元素

back() 返回尾部元素的引用

front() 返回头部元素的引用

C[n]C.at(n)  返回指定下标的引用,区别是后者如果下标越界则抛出异常

 

back()相当于*(--c.end())

front()相当于*c.begin()

 

 

3.删除元素

pop_back() 删除尾部元素

pop_front() 删除头部元素

erase(p)    删除迭代器p指向的元素,返回被删除元素之后的元素的迭代器

erase(b,e)   删除迭代器b,e之间的元素,返回被删除元素之后的元素的迭代器

clear()    删除所有元素

 

 

forward_list容器不使用上面的insertemplaceerase,它使用自己的成员函数:

insert_after()erase_after():参数和上面的一致

insertinsert_after的区别:

insert在迭代器p之前插入元素,并且返回指向第一个插入元素的迭代器

insert_after在迭代器p之后插入元素,并且返回指向最后一个插入元素的迭代器

eraseerase_after的区别:

erase 删除迭代器p指向的元素

erase_after 删除迭代器p之后的元素,他们都返回一个指向被删除元素之后的元素的迭代器

 

 

4.管理容器容量的成员函数:

shrink_to_fit()  将容量减少为可以容纳此时元素个数size()的大小

capacity()   重新分配内存空间时的元素数(意思是此时最多能存多少个元素)

reserve(n)   重新分配可以容纳n个元素的空间  

 

Q1:capacity()size()的区别:

前者表示此时分配的容量所能容纳的元素个数,不重新分配内存

后者表示此时容器中的元素数

Q2:resize(n)reserve(n)的区别:

前者表示改变容器中元素的数目,如果n小于此时存的元素数,则删除后面的元素,n>此时存的元素数,则添加新元素并初始化(可以使用resize(n,t):新加元素全部初始化为t),该函数不新分配内存

后者表示重新分配可以容纳n个元素的空间,元素数不变

posted @ 2015-08-15 19:01  runninglzw  阅读(1040)  评论(0编辑  收藏  举报