C++中模板类list常用示例

list是STL提供的一个线性链表的数据结构,其与vector的差异,类似于链表与数组的差异。

数组:可以随机读取访问,但是要插入和删除指定元素时不容易处理,因为在扩展或缩小数组空间时,对应的其他数组元素的位置会受到影响。

链表:不能够随机读取访问,但是插入和删除元素时较数组要方便很多,以双向线性链表为例,每个节点都通过前驱指针和后驱指针与前后元素保持访问关系,插入和删除元素时只涉及到最多三个元素的属性修改(即前、后、待插入删除的三个元素),不会对其他所有的元素产生影响。

使用示例如下:

#include <iostream>
#include <list>
#include <string>
#include <vector>
#include <algorithm>

using namespace std;

int main()
{
	list<string> strList;
	
	strList.push_back("nihao");
	strList.push_back("dajiahao");

	// 与vector相比较,这里多添加了push_front成员接口 
	strList.push_front("beijing");
	strList.push_front("shanghai");

	// 遍历list容器中的所有元素
	for (list<string>::iterator iterStrList = strList.begin(); iterStrList != strList.end(); iterStrList++)
	{
		cout << *iterStrList << endl;
	}

	// 向list容器中插入指定元素, 需要使用指定的迭代器来指明插入位置,然后将在该迭代器指向的元素之前进行插入
	strList.insert(strList.begin(), "guangzhou");
	strList.insert(++strList.begin(), "shenzhen");
	for (list<string>::iterator iterStrList = strList.begin(); iterStrList != strList.end(); iterStrList++)
	{
		cout << *iterStrList << endl;
	}

	// 使用remove()从list容器中删除元素
	strList.remove("nihao");
	for (list<string>::iterator iterStrList = strList.begin(); iterStrList != strList.end(); iterStrList++)
	{
		cout << *iterStrList << endl;
	}

	// 使用erase()从list
	list<string>::iterator iterDel;
	for (list<string>::iterator iterStrList = strList.begin(); iterStrList != strList.end(); iterStrList++)
	{
		if (*iterStrList == "guangzhou")
		{
			iterDel = iterStrList;
		}
	}
	strList.erase(iterDel);

	for (list<string>::iterator iterStrList = strList.begin(); iterStrList != strList.end(); iterStrList++)
	{
		cout << *iterStrList << endl;
	}

	// 注:对于list而言使用remove成员函数和erase成员函数都可以释放指定节点,
	// 但是对于vector而言,如果使用algorithm中的remove函数,则其与自身erase成员函数存在明显不同,使用remove只是将不等于指定val的元素前移,但不会真正删除,需要与erase配合使用
	vector<int> numTest;
	numTest.push_back(1);
	numTest.push_back(2);
	numTest.push_back(3);
	numTest.push_back(2);
	numTest.push_back(1);
	vector<int>::iterator iterNumTest;

	// 这种指定迭代器区间的,一般是前闭后开,即从begin到end的前一个元素
	iterNumTest = remove(numTest.begin(), numTest.end(), 2);
	for (vector<int>::iterator iterNum= numTest.begin(); iterNum != numTest.end(); iterNum++)
	{
		cout << *iterNum << endl;
	}

	numTest.erase(iterNumTest, numTest.end());
	for (vector<int>::iterator iterNum = numTest.begin(); iterNum != numTest.end(); iterNum++)
	{
		cout << *iterNum << endl;
	}

	// 同样可以使用find函数来查找容器中指定的元素,常用的algorithm中函数有sort(排序),unique(去重),find(查找)等

	system("pause");
	return 0;
}


  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值