C++核心编程和桌面应用开发 第十六天(list)

时间:2024-10-30 07:32:52

目录

1.list容器

1.1构造和赋值

1.2交换和大小

1.3插入和删除

1.4数据存取和反转

1.5排序


1.list容器

list是物理存储单元上非连续的存储结构,通过链表中的指针链接,链表由结点组成,一个是数据域,一个是存储下一个结点的地址域,且STL中的链表是一个双向循环链表,如下图

注意:STL中list的迭代器只支持前移和后移,属于双向迭代器

优点:

  • 动态存储分配,不会浪费内存
  • 插入、删除方便,只用修改指针

缺点:

  • 指针域和遍历的额外消耗大

注意:list的插入、删除都不会使原有list迭代器失效,但vector不成立

1.1构造和赋值

【构造函数】

【赋值函数】

1.2交换和大小

【交换函数】

注意:交换时,list中存储的数据类型必须和原数据类型相同

【大小函数】

1.3插入和删除

 【插入函数】

【删除函数】

1.4数据存取和反转

【存取函数】

【反转函数】

注意:list容器不可以通过[ ]和at访问数据

1.5排序

注意:STL中的排序算法 sort(begin(),end())只支持随机访问迭代器的容器,list是双向迭代器,但它内部有提供list.sort()排序,两种不同

list<int> num;
//默认升序
num.sort();

//回调函数
bool mySort(int v1,int v2)
{
	return v1 > v2;
}

//利用回调函数,实现降序
num.sort(mySort);

注意:可以利用回调函数或仿函数改变函数默认规则

//举例
class Person
{
public:
	string m_Name;
	int m_Age;

	Person(string name,int age)
	{
		m_Name = name;
		m_Age = age;
	}

	~Person();
};

//打印list
void printList(list<Person>& l)
{
	for (list<Person>::iterator it = l.begin(); it != l.end(); it++)
	{
		cout << (*it).m_Age << endl;
		cout << (*it).m_Name << endl;
	}
}

//回调函数
bool mySort(Person& p1, Person& p2)
{
	return p1.m_Age < p2.m_Age;
}

int main()
{
	list<Person> listPerson;
	listPerson.push_back(Person("zzz", 20));
	listPerson.push_back(Person("zzz",10));
	listPerson.push_back(Person("zzz", 60));
	listPerson.push_back(Person("zzz", 50));
	listPerson.push_back(Person("zzz", 40));

    //回调函数改变原有函数规则
	listPerson.sort(mySort);

	return 0;
}