一、list容器
1、基本概念
功能:将数据进行链式存储
链表是一种物理存储单元上非连续的存储结构,数据元素的逻辑顺序是通过指针实现的
链表由一系列的节点组成;
节点的组成:一个是存储数据元素的数据域,另一个是存储下一个节点地址的指针域;
STL的链表是一个双向循环链表。
链表list中的迭代器只支持前移或后移,属于双向迭代器。
链表优点:
1)可以对任意的位置进行快速的插入或删除元素。
2)采用动态分配内存,不会造成内存的浪费和溢出
缺点:
1)容器遍历速度没有数组快。
2)占用的空间比数组大
list有一个重要的性质:插入和删除操作都不会造成原有list迭代器失效,这在vector是不成立的。
2、list构造函数
与vector构造函数相同;
如默认构造:
list
3、赋值和交换操作
与vector等其他迭代器类似
函数原型:
1)assign(beg,end); //将[beg,end]区间赋值
2)assign(n,elem);
3)重载=运算符
4)swap(lst);//将lst与本身元素互换
4、大小操作
与vector相同;
5、list容器的插入与删除操作
push_back(elem);
pop_back();
push_front(elem);
pop_front();
insert(pos,elem);
insert(pos,n.elem);
insert(pos,beg,end);//在pos位置插入[beg,end) 区间的数据,无返回值
clear();//移除容器所有数据
erase(beg,end);//删除容器[beg,end)区间的数据,返回下一个数据的位置
erase(pos);//删除pos位置的数据,返回下一个数据的位置
remove(elem);//删除容器中所有与elem匹配的值
所有的位置不用索引,而是用迭代器
- void test02()
-
- {
-
- //反转和排序
-
- list<int>L;
-
- L.push_back(10);
-
- L.push_back(80);
-
- L.push_back(30);
-
- L.push_back(90);
-
- L.push_back(150);
-
- printL(L); //10 80 30 90 150
-
- L.reverse();
-
- printL(L); //150 90 30 80 10
-
- L.sort(); //所有不支持随机访问的迭代器不能直接用算法库中的sort形式:sort(beg,end);
-
- printL(L);//10 30 80 90 150 默认升序
-
- }
6、数据存取
front(); //返回第一个元素
back();//返回最后一个元素
list在物理上不是连续空间存储的,不能像vector用at()访问某个元素,也不能用[]下标的形式进行访问元素。
L[0] 不可用;L.at(1);也不可用;
list迭代器不支持随机访问;
it++;
it--;//支持双向
it=it+1;//不支持,不支持随机访问
7、list反转和排序
reverse(); //反转
sort(); //排序
8、排序案例
描述:将Person自定义数据类型进行排序,Person属性中有姓名、年龄、身高
排序规则:按照年龄进行升序,如果年龄相同则按身高进行降序
- class Person {
-
- public:
-
- string m_name;
-
- int m_age;
-
- int m_height;
-
- Person(string name, int age,int height)
-
- {
-
- this->m_name = name;
-
- this->m_age = age;
-
- this->m_height = height;
-
- }
-
- };
-
-
-
- //定义排序规则
-
- bool comparePerson(Person &p1,Person &p2)
-
- {
-
- //按年龄做一个升序
-
- if (p1.m_age == p2.m_age)
-
- {
-
- return p1.m_height < p2.m_height;
-
- }
-
- return p1.m_age < p2.m_age;
-
- }
-
-
-
- void printLP(list
&L) -
- {
-
- for (list
::iterator it = L.begin(); it != L.end(); it++) -
- {
-
- cout << "姓名:"<<(*it).m_name<< " 年龄:"<<(*it).m_age<<" 身高:"<<(*it).m_height<
-
- }
-
- cout << endl;
-
- }
-
- void test03()
-
- {
-
- //list容器排序案例
-
- list
P; -
- //准备数据
-
- Person p1("L", 18, 199);
-
- Person p2("I", 16, 177);
-
- Person p3("A", 19, 192);
-
- Person p4("O", 20, 190);
-
- Person p5("C", 20, 167);
-
- Person p6("H", 20, 187);
-
- P.push_back(p1);
-
- P.push_back(p2);
-
- P.push_back(p3);
-
- P.push_back(p4);
-
- P.push_back(p5);
-
- P.push_back(p6);
-
- printLP(P);
-
- cout << "========排序后=======" << endl;
-
- P.sort(comparePerson); //comparePerson为排序规则 为一个bool值
-
- printLP(P);
-
- }
注意:自定义数据类型排序,必须要指定规则。