您的位置:首页 > 其它

STL顺序容器总结

2015-08-15 19:01 218 查看
顺序容器总结:

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之前插入花括号包围的元素列表,返回指向第一个新添加元素的迭代器

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

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

比如(id和name分别是某一对象构造函数的参数):

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

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

2.访问元素

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

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

C
和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容器不使用上面的insert、emplace和erase,它使用自己的成员函数:

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

insert和insert_after的区别:

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

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

erase和erase_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个元素的空间,元素数不变
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: