C++高级_List容器_STL标准模板库

List容器详解

list是C++标准模版库(STL,Standard Template Library)中的部分内容。实际上,list容器就是一个双向链表,可以高效地进行插入删除元素。

list不可以随机存取元素,所有不支持 at.(pos) 函数和 [ ] 操作符,因此对于迭代器,只能通过“++”或“–”操作将迭代器移动到后继/前驱节点元素处。而不能对迭代器进行+n或-n的操作

如果你需要大量的插入和删除,而不关心随即存取,应该使用list容器

使用list容器之前必须加上<vector>头文件:#include <list>;

list属于std命名域的内容,因此需要通过命名限定:using std::list;

也可以直接使用全局的命名空间方式:using namespace std;

list的默认构造函数:

template <typename T>
list<T> zploo;         //list采用模板类实现,对象的默认构造形式
list<int> zploo;       //定义一个存放int的list容器
list<float> zploo;     //定义一个存放float的list容器
list<string> zploo;    //定义一个存放string的list容器

/*尖括号内还可定义指针类型 或 自定义类型*/

list的带参数构造:

list.(beg,end);    //构造函数 将【beg,end】区间中得元素拷贝给本身(注意:该区间是左闭右开的区间)
list(n,elem);      //构造函数将n个elem拷贝给本身
list(const list &zploo);    //拷贝构造函数

list的头尾添加和移除操作:

list.push_back(elem);   //从容器尾部添加一个元素
list.pop_back();        //删除容器中最后一个元素

list.push_front(elem);  //在容器开通插入一个元素
list.pop_front();       //从容器开通移除第一个元素

list的数据存取:

list.front();     //返回第一个元素
list.back();      //返回最后一个元素

list的赋值:

list.assign(beg,end);   //将【beg,end】区间中得数据拷贝赋值给本身(注意:该区间位左闭右开的区间)
list.assign(n,elem);    //将n个elem拷贝赋值给本身
list& operator= (const list& zploo);  //重载等会操作符
list.swap(zploolist);       //将zploolist于本身的元素互换

list的大小:

list.size();   //返回容器中元素的个数
list.empty();  //判断容器是否为空
list.resize(num);  //重新指定容器的长度位 num ,若容器变长,则以默认值填充新位置。若容器变短,则末尾超出容器长度的元素会被删除

list.resize(num,elem);   //重新指定容器的长度位 num ,若容器变长,则以elem填充新位置。若容器变短,则末尾超出容器长度的元素会被删除

list的插入和删除:

//插入
list.insert(pos,elem);    //在pos位置插入一个elem元素的拷贝,返回新数据的位置
list.insert(pos,n,elem);  //在pos位置插入n个elem数据,无返回值。
list.insert(pos,beg,end); //在pos位置插入【beg,end】区间的数据,无返回值。

//删除
list.clear();          //删除容器内所有的数据
list.erase(beg,end);   //删除【beg,end】区间的数据,返回下一个数据的位置
list.erase(pos);       //删除pos位置的数据,返回下一个数据的位置。
list.remove(elem);     //删除容器中所有与elem值匹配的元素

list的逆序排列:

list.reverse();     //反转链表,比如zploo中包含1,4,7元素,反转后变成了 7,4,1元素

练习演示代码:

#define  _CRT_SECURE_NO_WARNINGS 
#include <iostream>
#include <list>

using namespace std;

void  testList1()
{
	list<int> l;

	l.push_back(2);
	l.push_back(3);
	l.push_back(4);
	l.push_back(5);
	l.push_back(7);

	list<int> l2;

	l2.push_back(12);
	l2.push_back(13);
	l2.push_back(14);
	l2.push_back(15);
	l2.push_back(17);

	for (list<int>::iterator it = l.begin(); it != l.end(); it++) {
		cout << *it << " ";
	}
	cout << endl;
	//2, 3, 4, 5, 7

	l.insert(l.begin(), l2.begin(), l2.end()); //12, 13 ,14 ,15 ,17,     2, 3, 4, 5, 7
	for (list<int>::iterator it = l.begin(); it != l.end(); it++) {
		cout << *it << " ";
	}
	cout << endl;

	l.insert(l.begin(), 8);

	for (list<int>::iterator it = l.begin(); it != l.end(); it++) {
		cout << *it << " ";
	}
	cout << endl;
	//8, 12, 13 ,14 ,15 ,17,  2, 3, 4, 5, 7

	list<int>::iterator it = l.end();
	l.insert( it, 10, 8);
	cout << "----www.zploo.com----" << endl;

	//删除所有8的元素
	l.remove(8);
	for (list<int>::iterator it = l.begin(); it != l.end(); it++) {
		cout << *it << " ";
	}
	cout << endl;
	cout << "----www.zploo.com----" << endl;

	//逆序一个链表
	l.reverse();

	cout << "----www.zploo.com----" << endl;
	for (list<int>::iterator it = l.begin(); it != l.end(); it++) {
		cout << *it << " ";
	}
	cout << endl;

	/*
	list.clear();							//移除容器的所有数据
	list.erase(beg,end);		//删除[beg,end)区间的数据,返回下⼀个数据的位置。
	list.erase(pos);				//删除pos位置的数据,返回下⼀个数据的位置。
	lst.remove(elem);			//删除容器中所有与elem值匹配的元素。
		*/
	l.erase(l.begin());
	for (list<int>::iterator it = l.begin(); it != l.end(); it++) {
		cout << *it << " ";
	}
	cout << endl;

	// 
	l.erase(l.begin(), l.end());
	for (list<int>::iterator it = l.begin(); it != l.end(); it++) {
		cout << *it << " ";
	}
	cout << endl;

	l.push_back(2);
	l.clear();
	if (l.empty() == true) {
		cout << "kong " << endl;
	}

}

int main(void)
{
	testList1();
	return 0;
}

 

暂无评论

发表评论