#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
#include <List>
using namespace std;
template <class T>
void printList(const list<T>& l)
{
for (class list<T> ::const_iterator it = l.begin(); it != l.end(); it++)
{
cout << *it << " ";
}
cout << endl;
}
void test01()
{
//list的构造函数
//list<T> lst; //默认构造,list采用模板类实现
//list(begin, end); //构造函数,利用迭代器实现区间赋值
//list(n, elem); //构造函数,将n个elem赋值给本身
//list(const list & lst); //拷贝构造
list<int> l1;
l1.push_back(10);
l1.push_back(20);
l1.push_back(30);
l1.push_back(40);
l1.push_back(50);
list<int> l2(l1.begin(), l1.end());
list<float> l3(5, 100.00f);
list<float> l4(l3);
printList(l1);
printList(l2);
printList(l3);
printList(l4);
}
void test02()
{
//list的赋值和交换
//list& operator=(const list & lst); //重载赋值运算符
//assign(begin, end); //利用迭代器实现区间赋值
//assign(n, elem); //将n个elem赋值给本身
//swap(lst);
list<int> l1;
l1.push_back(10);
l1.push_back(20);
l1.push_back(30);
l1.push_back(40);
l1.push_back(50);
list<int> l2;
l2.assign(l1.begin(), l1.end());
printList(l1);
printList(l2);
}
void test03()
{
//size(); //返回容器中元素个数
//empty(); //判断容器是否为空
//resize(num); //重新指定容器长度,若变长,变长的部分赋值为0,若变短,超出容器长度的元素被删除
//resize(num, elem); //重新指定容器长度,若变长,变长的部分赋值为elem,若变短,超出容器长度的元素被删除
list<int> l1;
l1.push_back(10);
l1.push_back(20);
l1.push_back(30);
l1.push_back(40);
l1.push_back(50);
cout << l1.size() << endl;
l1.resize(10);
cout << l1.size() << endl; //链表只有size,没有capacity
}
void test04()
{
//list的插入和删除
//1.push_back(elem); //在容器尾部插入一个元素
//2.push_front(elem); //在容器头部插入一个元素
//3.pop_back(); //在容器尾部删除一个元素
//4.pop_front(); //在容器头部删除一个元素
//5.insert(pos, elem); //在迭代器pos处插入一个元素elem,返回新数据的位置
//6.insert(pos, n, elem); //在迭代器pos处插入n个元素elem,无返回值
//7.insert(pos, begin, end);//在迭代器pos处插入[begin,end)区间的数据,无返回值
//8.clear(); //清除容器中所有数据
//9.erase(begin, end); //删除[begin,end)区间的数据,返回下一个数据的位置
//10.erase(pos); //删除迭代器pos处的数据,返回下一个数据的位置
//11.remove(elem); //删除容器中所有等于elem的元素
//12front(); //返回容器第一个元素
//13.back(); //返回容器最后一个元素
list<int> l1;
l1.push_back(10);
l1.push_back(20);
l1.push_back(30);
l1.push_back(40);
l1.push_back(50);
l1.remove(50);
printList(l1);
l1.insert(l1.end(), 50);
printList(l1);
//l1.erase(l1.end() - 1)
//写法错误,链表不支持随机访问,既不能对迭代器进行加减常数
//但是支持自增自减
l1.erase(--l1.end());
printList(l1);
}
class Person
{
public:
Person(const int& w_age, const string& w_name, const double& w_height)
{
this->age = w_age;
this->name = w_name;
this->height = w_height;
}
int age{};
string name;
double height;
};
//注意这里的回调函数不能写在类Person的上面,因为回调函数的形参是Person类
//使用Person类此前必须有声明
bool myCompare(Person p1, Person p2)
{
//如果年龄相等,就按身高由大到小排列
if (p1.age == p2.age) return p1.height > p2.height;
return p1.age > p2.age;
}
void test05()
{
//list的反转与排序
//reverse(); //反转链表
//.sort(); //排序链表。注意这是一个成员函数,
list<int> l1;
l1.push_back(49);
l1.push_back(19);
l1.push_back(40);
l1.push_back(39);
l1.push_back(9);
//如果容器支持随机访问,则可以采用系统标准的算法进行排序
//如果不支持,则采用容器的成员函数进行排序
//如果要从大到小排列,就要加一个回调函数
//l1.sort(myCompare)
l1.sort();
printList(l1);
l1.reverse();
printList(l1);
//自定义类型的数据排序
Person p1(200, "张三", 190.72);
Person p2(300, "赵四", 170.20);
Person p3(100, "王五", 177.32);
Person p4(100, "钱六", 188.45);
Person p5(100, "李七", 170.14);
list<Person> l2;
l2.push_back(p1);
l2.push_back(p2);
l2.push_back(p3);
l2.push_back(p4);
l2.push_back(p5);
//现在按照一个年龄从大到小排序
l2.sort(myCompare);
for (list<Person> :: iterator it = l2.begin(); it != l2.end(); it++)
{
cout << "name:" << it->name << " age:" << it->age << " height:" << it->height << endl;
}
}
int main()
{
test01();
test02();
test03();
test04();
test05();
return 0;
}
运行结果: