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之前插入花括号包围的元素列表,返回指向第一个新添加元素的迭代器
可以注意到:push和emplace都可以插入到容器中,这两个函数的区别是什么呢?
当调用push成员函数时,将元素类型的对象传给形参,这些类型被拷贝到容器中,而emplace成员函数是自己在容器内存空间中构造元素。
比如(id和name分别是某一对象构造函数的参数):
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容器不使用上面的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个元素的空间,元素数不变