1.list的特点
2.list的方法
头文件:#include<list>
1.list 的特点
1.1 vector 是拥有一段连续的内存,可以高效地随机访问,而 list 相当与数据结构的双向链表,所以他的内存是不连续的。所以 list 不能像 vector 那样进行随机存储访问,即不能用[ ],而是要用迭代器进行数据访问,但也因为 list 内存不连续的特点,使得他可以高效地进行任何地方的插入删除操作;
1.2实际操作时,如果你需要高效的随机存取,而不在乎插入和删除的效率,用 vector。
如果你需要大量的插入与删除而不用随机存取访问,可以用 list。
2.list的方法:
2.1.list的构造
list<int>list1; //构造空的列表 list1
lsit<int>list2(5);//构造5个成员,值都为0的列表list2
list<int>list3(5,1);//构造有5个1的列表 list3
list<int>list5=list4;//通过复制 list4 构造 list5
2.2.list的判断和清空
empty(); //判断是否为空列表
list<int>list1;
if(list1.empty())
{
std::cout<<"empty"<<std::endl;
}
size();//返回列表的个数
list<int>list1;
int size = list1.size();
clear();//清空列表中的所有数据,size变为0
list<int>list1(5,1);
list1.clear();
2.3 列表迭代器操作
迭代器和指针很像。
用迭代器遍历列表:
int main()
{
list<int>l1(5,1); //构造5个1的列表
list<int>::iterator ti; //构造一个列表迭代器ti
for(ti=l1.begin();ti!=l1.end();ti++)
{
cout<<*ti<<endl; //打印迭代器 ti 指向的内容
}
return 0;
}
//ti = l1.begin()表示指l1列表的第一个元素
//l1.end() 返回列表 l1 的最后一个元素的位置再后一个位置
2.4.list 的数据操作
2.4.1 push_back()和push_front():
push_back()是从 list 的末尾插入数据,而 push_front()是在 list 的头部插入数据
list<int>list1;
list1.push_front(1); //在list1的头部插入数据 1
list1.push_back(9); //在list1的末尾插入数据9
return 0; //list1中的数据就是 1,9
2.4.2 pop_back()和pop_front():
pop_back()是删除列表最末尾一个数据
pop_front()是删除列表最开头的一个数据
list<int>list1(10,1);
list1.pop_back();//删除list1的最后一个数据
list1.pop_front();//删除list1的最前的一个数据
使用pop_back()和pop_front()时必须对列表判空,如果列表为空调用pop_back()和pop_front()的话,会导致程序崩溃
2.3.3 front()和back():
front()返回列表的第一个数据。
back()返回列表最后一个数据。
list<int>l1;
l1.push_back(1);
l1.push_back(9);
cout<<l1.front()<<endl;
cout<<l1.back()<<endl;
2.3.4 insert():插入数据
insert(list.begin(),1) ;//在列表 list 的开头之前插入一个元素1,即1作为 list 的第一个元素。(把begin()换成其他迭代器位置也可以,下同)
insert(list.begin(), 2 , 1); //再列表 list 的开头之前插入 2 个1.
insert( list1.begin() , list2.begin() , list2.end() ) ; //在列表 list1 的开头插入 list2 的全部元素,即list2 在list1 前面
list<int>list1; //构造一个空列表
list1.insert(list1.begin(),8); //往空列表的起始位置插入一个数据8
2.3.5 erase(); //删除列表一个数据或一个区域的数据
list.erase( list1.begin() ); //删除列表的开头元素,把begin()换成其他迭代器位置也可以
list.erase(list.begin(),list.end()); //删除列表开头到结尾的元素,即全部元素,删除后,列表的size为0
list<int>list1; //创建list1空列表
list<int>::iterator ti; //创建迭代器 ti
list1.push_back(1);
list1.push_back(2);
list1.push_back(3); //往list1列表插入1,2,3
ti = list1.begin(); //迭代器 ti 指向列表的第一个元素
for(int i=0;i<2;i++,ti++) //删除列表第二个元素
list1.erase(ti);
2.5列表链操作
2.5.1 1 list.assign( list2.begin() , list2.end() );//把列表 list2 的begin()指向的元素,会list2.end()的前一个元素复制到 列表list 中。即把list2复制给list,当然也可以换成其他迭代器
list<int>list1;
list<int>list2; //创建空的列表 list1 和 list2
list1.push_back(1);
list1.push_back(2); //往列表 list1 中插入元素 1 和 2
list2.assign(list1.begin(),list1.end()); //把 list1 中的所有元素复制到list2中
cout<<list2.size()<<endl;
2.5.1.2 list.assign(n , val) ; //把列表list 中改成 n 个val。
list<int>list1(3,5);
list1.assign(1,2); //此时链表中只有1个 2
list<int>list1(5,1);
list<int>list2(4,2);
list1.swap(list2);
2.5.3 list1.reverse();
使列表 list1 倒置:
list<int>list1;
list1.push_back(1);
list1.push_back(2);
list1.push_back(3); //往list1插入1,2,3
list1.reverse(); //列表倒置,变成3,2,1