目录
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;
}