stl(11)list容器
1.list容器是一种链表容器。它存储的数据在物理内存上并不是连续的。list容器中的每一个元素就是一个结点,这个结点包括两部分:一是存储的数据,二是指向下一个结点的指针和上一个结点的指针。这样即使是在物理上不连续的空间也可以通过这些指针将全部数据串起来。
2.由于list的结构它不像vector容器那样需要一段连续的空间,所以list中每增加一个元素就分配一个元素的空间,也不会产生vector容器那样连续存储空间满了需要挪动数据的问题。
3.list相对于vector容器相比,它采用动态存储分配既2中所描述的,不会存在内存浪费和溢出。list执行元素的插入和删除十分方便,只需要修改前后结点指针的指向即可,不像vector那样还需要挪动元素。list相对于vector需要更多的存储空间,因为它除了存储数据外还需要存储前后结点的指针。list在查询的时候可能消耗的时间比较大,它需要沿着指针去寻找,而vector容器由于存储空间是连续的所以根据地址加减就可以找到数据了。
4.list是双向循环链表。即尾结点的next指针指向头结点,头结点的prev结点指向尾结点。
5.list的构造函数,赋值操作。push_back,pop_back,push_front(头部插入),pop_front(头部删除),insert(插入),erase(删除),clear(清空)的用法和vector容器一样。
std::list<int> list;
list.push_back(10);
list.push_back(20);
list.push_back(30);
list.push_back(40);
for (std::list<int>::iterator it = list.begin(); it != list.end();it++) {
std::cout<<*it<<std::endl;
}
6.remove用于移除list容器中与传入参数相同的对象
std::list<int> list;
list.push_back(10);
list.push_back(20);
list.push_back(30);
list.push_back(40);
list.remove(20);
7.swap,empty,resize,size,front,back的用法与vector容器一致
8.reverse用于将list容器中的元素排序翻转。
std::list<int> list;
list.push_back(10);
list.push_back(20);
list.push_back(30);
list.push_back(40);
list.reverse();
9.由于list的迭代器不是随机访问迭代器,所以不支持使用[]和at来下标访问元素。也不能使用std::sort方法来排序。需要使用list容器自身提供的sort方法来排序。
std::list<int> list;
list.push_back(10);
list.push_back(50);
list.push_back(80);
list.push_back(40);
list.sort();