【C++】List容器的用法解析

【C++】List容器的用法解析

#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;
}

运行结果:

【C++】List容器的用法解析

 

上一篇:【Nginx反向代理】Nginx反向代理到Tomcat出错:The character [_] is never valid in a domain name


下一篇:大整数与高精度