list:
list类似于链表,它的存储空间不是连续的,但是可以快速的插入和删除,但是随机访问比较慢。
assign() 给list赋值 back()返回最后一个元素 begin()返回指向第一个元素的迭代器
clear() 清空list empty()如果list为空返回true erase() 删除一个元素
insert() 插入一个元素 merge() 合并两个list pop_back() 删除最后一个元素
remove() 删除元素 resize() 改变list的大小 reverse() 把list的元素倒转
swap() 交换两个list unique() 删除list中重复的元素
list是一种序列式容器。list容器的功能实际上和数据结构中的双向链表是极其相似的,list中的数据元素是通过链表指针串连成逻辑意义上的线性表,就是list也具有链表的主要优点:在链表的任一位置进行元素的插入、删除操作都是快速的。list的实现是这样的(基本list):list的每个节点有三个域:前驱元素指针域、数据域和后继元素指针域。前驱元素指针域保存了前驱元素的首地址;数据域则是本节点的数据;后继元素指针域则保存了后继元素的首地址。其实,list和环形链表也有相似的地方,即:头节点的前驱元素指针域保存的是链表中尾元素的首地址,list的尾节点的后继元素指针域则保存了头节点的首地址,这样,list实际上就构成了一个双向循环链。由于list元素节点并不要求在一段连续的内存中,显然在list中是不支持快速随机存取的,因此对于迭代器,只能通过“++”或“--”操作将迭代器移动到后继/前驱节点元素处。而不能对迭代器进行+n或-n的操作。
list<int> a{1,2,3,4,5}; //初始化为12345
list<int> a(n); //n个元素,初始化为0
list<int> a(n,m);
list<int> a(s.begin(), s.end());// s是别的列表
//begin()和end()就是迭代器
#inclde <iostream>
#include <list>
using namespace std;
int main()
{
list<int> lst;
list<int> lst_bak(2, 0);
list<int>::iterator iter;//list迭代器
lst.push_back(1);
lst.push_back(2);
lst.push_back(3);
lst.merge(lst_bak); //合并
for(iter = lst.begin(); iter != lst.end(); ++iter)
{
cout << *iter << endl;
}
return 0;
}
deque:
deque全称:”double ended queue”,双端队列。在头和尾插入元素很方便,在中间很费时。
deque是双向开扣的连续线性空间,当deque的存储不足时,向两端动态扩展,不想vector那样,重新申请内存,然后复制元素。
deque是一种优化了的对序列两端元素进行添加和删除操作的基本序列容器。由一些独立的区块组成,第一区块朝某方向扩展,最后一个区块朝另一方向扩展。多个连续的内存块。并且在一个映射结构中保存对这些块以及顺序的跟踪。(vector是一个连续的内存块)
deque<int> deq;
deque<int> deq(5);//大小为5,value默认为0
deque<int> deq(5, 2);
- deq[ ]:用来访问双向队列中单个的元素。
- deq.front():返回第一个元素的引用。
- deq.push_front(x):把元素x插入到双向队列的头部。 pop_front()删除
- deq.push_back(x):把元素x插入到双向队列的尾部. pop_back()删除
deque和vector的一些区别:
1.两端都可以快速插入和删除元素。vector只能在尾端。
2.deque的元素存取和迭代操作会慢,内部结构会多一个间接过程。内存块不连续。
3.迭代器是特殊的智能指针,需要在不同区块之间跳转。
4.除了首尾插入和删除元素,其它位置会使得deque的iterator失效。
5.可以在中间插入和删除元素,但是性能不如list。
6.不可以通过capacity和reverse操作。vector可以。
#include <iostream>
#include <deque>
#include <string>
#include <iterator>
using namespace std;
int main()
{
deque<string> str;
str.assign(4, string("deque"));//放入四个deque
str.push_back("last");
str.push_front("first");
copy(str.begin(), str.end(),
ostream_iterator<string>(cout, " "));//输出str的内容,以“ ”隔开
cout << endl;
for (int i = 0; i < str.size(); ++i)
cout << "str[" << i << "] : " << str[i] << endl;
cout << endl;
for (int i = 0; i < str.size(); ++i)
cout << "str.at(" << i << ") : " << str.at(i) << endl;
cout << endl;
return 0;
}
result:
first deque deque deque deque last
str[0] : first
str[1] : deque
str[2] : deque
str[3] : deque
str[4] : deque
str[5] : last
str.at(0) : first
str.at(1) : deque
str.at(2) : deque
str.at(3) : deque
str.at(4) : deque
str.at(5) : last