1.
C++中的list 容器,又称双向链表容器,即该容器的底层是以双向链表的形式实现的。这意味着,list 容器中的元素可以分散存储在内存空间里,而不是必须存储在一整块连续的内存空间中
如下图所示,list 容器中各个元素的前后顺序是靠指针来维系的,每个元素都配备了 2 个指针,分别指向它的前一个元素和后一个元素。其中第一个元素的前向指针总为 null,因为它前面没有元素;同样,尾部元素的后向指针也总为 null;
优点:在序列已知的任何位置快速插入或删除元素(时间复杂度为O(1))。并且在 list 容器中移动元素,也比其它容器的效率高
缺点:不能像 array 和 vector 那样,通过位置直接访问元素。举个例子,如果要访问 list 容器中的第 6 个元素,它不支持容器对象名[6]这种语法格式,正确的做法是从容器中第一个元素或最后一个元素开始遍历容器,直到找到该位置。
用法:
头文件包含:
#include <list>
使用格式:
list <类型> 名字;//如 list <int> L;
上面这种表示申请为空链表
如果要申请一个包含10个元素的list则:
list <类型>L(10);
也可以指定初始化元素
list <int> L(10,100);//10个元素,每个元素的值都是100
Person p("张三",23);
list <Person>L2(10,P); //10个元素,每个元素都初始化成一个对象
下面是该容器所有的函数:
begin() 返回指向容器中第一个元素的双向迭代器。
end() 返回指向容器中最后一个元素所在位置的下一个位置的双向迭代器。
rbegin() 返回指向最后一个元素的反向双向迭代器。
rend() 返回指向第一个元素所在位置前一个位置的反向双向迭代器。
cbegin() 和 begin() 功能相同,只不过在其基础上,增加了 const 属性,不能用于修改元素。
cend() 和 end() 功能相同,只不过在其基础上,增加了 const 属性,不能用于修改元素。
crbegin() 和 rbegin() 功能相同,只不过在其基础上,增加了 const 属性,不能用于修改元素。
crend() 和 rend() 功能相同,只不过在其基础上,增加了 const 属性,不能用于修改元素。
empty() 判断容器中是否有元素,若无元素,则返回 true;反之,返回 false。
size() 返回当前容器实际包含的元素个数。
max_size() 返回容器所能包含元素个数的最大值。这通常是一个很大的值,一般是 232-1,所以我们很少会用到这个函数。
front() 返回第一个元素的引用。
back() 返回最后一个元素的引用。
assign() 用新元素替换容器中原有内容。
emplace_front() 在容器头部生成一个元素。该函数和 push_front() 的功能相同,但效率更高。
push_front() 在容器头部插入一个元素。
pop_front() 删除容器头部的一个元素。
emplace_back() 在容器尾部直接生成一个元素。该函数和 push_back() 的功能相同,但效率更高。
push_back() 在容器尾部插入一个元素。
pop_back() 删除容器尾部的一个元素。
emplace() 在容器中的指定位置插入元素。该函数和 insert() 功能相同,但效率更高。
insert() 在容器中的指定位置插入元素。
erase() 删除容器中一个或某区域内的元素。
swap() 交换两个容器中的元素,必须保证这两个容器中存储的元素类型是相同的。
resize() 调整容器的大小。
clear() 删除容器存储的所有元素。
splice() 将一个 list 容器中的元素插入到另一个容器的指定位置。
remove(val) 删除容器中所有等于 val 的元素。
remove_if() 删除容器中满足条件的元素。
unique() 删除容器中相邻的重复元素,只保留一个。
merge() 合并两个事先已排好序的 list 容器,并且合并之后的 list 容器依然是有序的。
sort() 通过更改容器中元素的位置,将它们进行排序。
reverse() 反转容器中元素的顺序。
这里提一下排序:
排序规则可以自己指定如下:
bool sort_rule(Person &p1,Person &p2)
{
return p1.age > p2.age;
}
传入两个元素,规则函数内指定排序规则
用法:
pList.sort(sort_rule);
样例:
#include <iostream>
#include <list>
#include <algorithm>
#include <string>
using namespace std;
void print(const list<int> <)
{
for(list<int>::const_iterator it = lt.begin(); it!= lt.end();it++)
{
cout << *it << " ";
}
cout << endl;
}
void test01(void)
{
list <int>L1;
L1.push_back(10);
L1.push_back(20);
L1.push_back(30);
L1.push_back(40);
L1.push_back(50);
L1.push_back(60);
L1.push_back(70);
print(L1);
list <int> L2 = L1;
print(L2);
list <int> L3;
L3.assign(L2.begin(),L2.end());
print(L3);
list <int> L4;
L4.assign(10,100);
print(L4);
}
void test02(void)
{
list <int>L1;
L1.push_back(10);
L1.push_back(20);
L1.push_back(30);
L1.push_back(40);
L1.push_back(50);
L1.push_back(60);
L1.push_back(70);
print(L1);
list <int> L2;
L2.assign(10,100);
print(L2);
cout << "after swap:" << endl;
L1.swap(L2);
print(L1);
print(L2);
}
void test03(void)
{
list <int> L1;
L1.push_back(10);
L1.push_back(20);
L1.push_back(30);
L1.push_back(40);
L1.push_back(50);
L1.push_back(60);
print(L1);
if(L1.empty())
{
cout << "L1 is empty" << endl;
}
else
{
cout << "L1 is not empty" << endl;
cout << "L1 size:" << L1.size() << endl;
}
L1.resize(10,33);
print(L1);
L1.resize(2);
print(L1);
}
void test04(void)
{
list <int> L5;
L5.push_back(10);
L5.push_back(20);
L5.push_back(30);
L5.push_back(40);
L5.push_back(50);
L5.push_back(60);
L5.push_front(70);
print(L5);
L5.pop_back();
print(L5);
L5.pop_front();
print(L5);
list <int>::iterator it = L5.begin();
++it;
L5.insert(it,300);
print(L5);
++it;
L5.erase(it);
print(L5);
L5.push_back(10000);
L5.push_back(10000);
L5.push_back(10000);
L5.push_back(10000);
print(L5);
L5.remove(10000);
print(L5);
}
void test05(void)
{
list <int> L1;
L1.push_back(60);
L1.push_back(20);
L1.push_back(30);
L1.push_back(40);
L1.push_back(20);
L1.push_back(10);
cout << L1.front() << endl;
cout << L1.back() << endl;
print(L1);
L1.reverse();
print(L1);
L1.sort();
print(L1);
}
class Person{
public:
Person(string nam,int ag)
{
this->name = nam;
this->age = ag;
}
string name;
int age;
};
void printP(const list<Person> <)
{
for(list<Person>::const_iterator it = lt.begin(); it!= lt.end();it++)
{
cout << "姓名:"<< it->name << " 年龄:" << it->age <<endl;
}
}
bool sort_rule(Person &p1,Person &p2)
{
return p1.age > p2.age;
}
void testP(void)
{
Person p1("张三",12);
Person p2("李四",32);
Person p3("王五",25);
Person p4("赵六",20);
Person p5("周七",18);
Person p6("刘八",24);
list <Person> pList;
pList.push_back(p1);
pList.push_back(p2);
pList.push_back(p3);
pList.push_back(p4);
pList.push_back(p5);
pList.push_back(p6);
printP(pList);
pList.sort(sort_rule);
cout << "----------------------------------------------"<<endl;
printP(pList);
}
int main(void)
{
//test01();
//test02();
//test03();
//test04();
//test05();
testP();
return 0;
}