list容器会了吗?一文理解它

2023-10-10 14:08:06 浏览数 (1)

list 数据链式存储

list的优点 1.采用动态存储分配,不会造成内存浪费和溢出 2.链表执行插入和删除操作十分简单,修改指针即可,不需要移动大量元素

缺点: 时间(遍历)和空间(指针域)额外耗费大

重要性质:list在插入删除操作时不会造成原有list迭代器的失效,vector不成立

list构造函数 (deque)和前面的一模一样构造

list容器赋值和交换

大小操作

代码语言:javascript复制
#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
#include<list>

empty() 判断容器是否为空 capacity() 容器的容量 size() 返回容器中元素的个数 resize(int num) 重新指定容器的长度为num, 如果容器变长则以默认值填充新位置 如果容器变短,则末尾超过容器长度的元素删除 resize(int num,elem) 重新指定容器的长度为num, 如果容器变长则以elem值填充新位置 如果容器变短,则末尾超过容器长度的元素删除

插入操作

push_back(elem); 在容器尾部插入一个元素 pop_back(); 删除容器中最后一个元素 push_front(elem); 在容器开头插入一个元素 pop_front(); 在容器开头删除第一个元素 insert(pos,elem); 在pos插入elem元素的拷贝,返回新数据的位置 insert(pos,n,elem) 在pos位置插入n个elem,无返回值 insert(pos,beg,end) 在pos插入区间【beg,end】的数据,返回下一个数据的位置 clear(); 移除容器中所有的数据 erase(beg,end); 删除区间【beg,end】的元素,返回下一个元素的位置 erase(pos) 删除pos位置的数据,返回下一个数据的位置2 remove(elem) 删除容器中所有与elem元素匹配的数据

list数据存取

函数原型: front(); 访问第一个数据 back(); 访问最后一个数据

list、本质是链表,数据不是连续的线性空间存储 不支持随机访问 比如采用L[],L.at();deng 迭代器只能进行(双向) ,–,不支持随机访问

list容器的反转和排序

代码语言:javascript复制
/*
void printlist(list<int>& l)
{
	for (list<int>::iterator it = l.begin(); it !=l.end(); it  )
	{
		cout << *it<<" ";
	}
	cout << endl;
}

void test()
{
	list<int>l;//默认构造
	l.push_back(10);
	l.push_back(20);
	l.push_back(30);
	printlist(l);
	list<int>l1;
	l1 = l;//operatr= 赋值
	printlist(l1);
	//assign赋值
	list<int>l2;
	l2.assign(10, 100);
	printlist(l2);

	//jiaohua
	l1.swap(l2);
	printlist(l1);
	printlist(l2);
}
bool compere(int val,int vall)
{
	return val > vall;
}
void test01()
{
	list<int>l2;
	l2.push_back(10);
	l2.push_back(30);
	l2.push_back(20);
	l2.push_back(60);
	printlist(l2);
	//反转:
	l2.reverse();
	printlist(l2);
	//排序:
	//所有不支持随机访问的迭代器容器 不可以用标准算法
	//内部提供算法 变成调佣函数  (成员函数)
	//错误:sort(l2.begin(), l2.end());
	l2.sort();  //升序
	printlist(l2);
	//降序?提供一个函数
	l2.sort(compere);
	printlist(l2);
}
*/

//排序案例::: //排序遍历,自定义类型排序,高级排序 /*

代码语言:javascript复制
class person
{
public:
	person(int age,int high, string name)
	{
		this->age = age;
		this->high = high;
		this->name = name;
	}
	int age;
	string name;
	int high;
};
void printlist(list<person>& l)
{
	for (list<person>::iterator it = l.begin(); it != l.end(); it  )
	{
		cout << "年龄:" << it->age << "身高:" << it->high << "姓名:" << it->name;
		cout << endl;
	}
	
}
bool compere(person p1,person p2)
{
	if (p1.age == p2.age)
	{
		return p1.high < p2.high;
	}
	return p1.age > p2.age;//此时按年龄来降序了
}
void test02()
{
	person p1(20, 180, "小洁洁");
	person p2(22, 178, "小前钱");
	person p3(20, 160, "小短短");
	person p4(20, 170, "小中中");
	person p5(23, 190, "小大大");
	list<person>l;
	l.push_back(p1);
	l.push_back(p2);
	l.push_back(p3);
	l.push_back(p4);
	l.push_back(p5);
	printlist(l);
	//paixu:
	//直接调用l.sort();会出错,因为编译器不知道按什么来排序
	//l.sort();
	cout << endl;
	l.sort(compere);
	printlist(l);
}

int main()
{
	//test01();
	//test();
	test02();
	system("pause");
	return 0;
}

0 人点赞