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