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