您的位置:首页 > 编程语言 > C语言/C++

C++STL之list容器

2017-04-03 23:10 471 查看
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


2.5.2  list1.swap( list2 ) ;     //列表list1 与 list2 交换

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