list容器
一、list特性
链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。
链表,只要拿到了第一个结点,就相当于拿到了整个链表。
特性总结:
- 采用动态存储分配,不会造成内存浪费和溢出
- 链表执行插入和删除操作十分方便,修改指针即可,不需要移动大量元素
- 链表灵活,但是空间和时间额外耗费较大
二、list常用API
1、list构造函数
2、list数据元素插入和删除操作
3、list大小操作
4、list赋值操作
5、list数据的存取
6、list反转排列排序
思考:链表和数组有什么区别?
(1)数组必须事先定义固定的长度(元素个数),不能适应数据动态地增减的情况。当数据增加时,可能超出原先定义的元素个数;当数据减少时,造成内存浪费。
(2)链表动态地进行存储分配,可以适应数据动态地增减的情况,且可以方便地插入、删除数据元素。(数组中插入、删除数据项时,需要移动其它数据项)
三、案例
#define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <list> using namespace std; void PrintList(list<int>& l) { for (list<int>::iterator it = l.begin();it != l.end();it++) { cout << *it << " "; } cout << endl; } //list初始化 void test01() { list<int> mlist1; list<int> mlist2(10, 10); list<int> mlist3(mlist2); list<int> mlist4(mlist2.begin(), mlist2.end()); PrintList(mlist4);//10 10 10 10 10 10 10 10 10 10 } //list插入和删除 void test02() { list<int> mlist; //插入操作 mlist.push_back(100); mlist.push_front(200); mlist.insert(mlist.begin(), 300);//相当于mlist.push_front(300); mlist.insert(mlist.end(), 400);//相当于mlist.push_back(400); mlist.insert(mlist.end(), 200); //在第二个位置插入 list<int>::iterator it = mlist.begin(); it++; it++; mlist.insert(it, 500); mlist.insert(mlist.end(), 200); PrintList(mlist);//300 200 500 100 400 200 200 //删除 mlist.remove(200);//删除匹配所有值 PrintList(mlist);//300 500 100 400 mlist.pop_back(); mlist.pop_front(); PrintList(mlist);//500 100 mlist.erase(mlist.begin(), mlist.end());//相当于mlist.clear(); PrintList(mlist);//输出空字符 } //list赋值操作 void test03() { list<int> mlist; mlist.assign(10, 10); list<int> mlist2; mlist2 = mlist; mlist2.swap(mlist); PrintList(mlist);//10 10 10 10 10 10 10 10 10 10 } //list反转 void test04() { list<int> mlist; for (int i = 0;i < 10;i++) { mlist.push_back(i); } PrintList(mlist);//0 1 2 3 4 5 6 7 8 9 //容器元素反转 mlist.reverse(); PrintList(mlist);//9 8 7 6 5 4 3 2 1 0 } bool mycompare05(int v1,int v2) { return v1 > v2; } //list排序 void test05() { list<int> mlist; mlist.push_back(2); mlist.push_back(1); mlist.push_back(7); mlist.push_back(5); PrintList(mlist);//2 1 7 5 //排序 对象默认从小到大排序 mlist.sort(); PrintList(mlist);//1 2 5 7 //排序 对象从大到小排序 mlist.sort(mycompare05); PrintList(mlist);//7 5 2 1 //算法sort 支持可随机访问的容器,但是链表不是随机访问容器,所以不能用算法sort进行排序 } int main(void) { //test01(); //test02(); //test03(); //test04(); test05(); return 0; }