Loading... ## list基本概念 ### 功能: 将数据进行链式存储 ### 链表: 是一种物理存储单元上非连续的存储结构,数据元素的逻辑顺序是通过链表中的指针链接实现的 #### 链表的组成: 链表由一系列结点组成 #### 结点的组成: 一个存储数据元素的数据域,另一个是存储下一个结点地址的指针域 STL中的链表是一个双向循环链表,由于链表的存储方式并不是连续的内存空间,因此链表list中的迭代器只支持前移和后移,属于双向迭代器 ### list的优点: 采用动态存储分配,不会造成内存浪费和溢出 链表执行插入和删除操作十分方便,修改指针即可,不需要移动大量元素 ### list的缺点: 链表灵活,但是空间(指针域)和时间(遍历)额外耗费较大 list有一个重要的性质,插入操作和删除操作都不会造成原有的list迭代器的实效,这在vector是不成立的 ## 构造函数: ### 功能描述: 创建list容器 ### 函数原型: list< int>lst; //list采用模板类实现,对链表对象的默认构造形式 list(beg, end);//构造函数将(beg, end)区间中的元素拷贝给本身 list(n, elem);//构造函数将n个elem拷贝给本身 list(const list &lst);//拷贝构造函数 ### 示例: ```cpp #include<iostream> #include<list> using namespace std; void print_list(const list<int>& li) { for (list<int>::const_iterator it = li.begin(); it != li.end(); it++) { cout << *it << " "; } cout << endl; } void create_list(list<int>& li) { li.push_back(10); li.push_back(20); li.push_back(30); li.push_front(40); li.push_front(50); li.push_front(60); } void text(list<int>& lt) { list<int>lt1(lt.begin(), lt.end()); //区间构造 print_list(lt1); list<int>lt2(lt);//拷贝构造 print_list(lt2); list<int>lt3(10, 100);//10个100拷贝构造 print_list(lt3); } int main() { list<int>li; //默认构造 create_list(li); print_list(li); text(li); return 0; } ``` ## 赋值和交换: ### 功能: 给list容器进行赋值,以及交换list容器 ### 函数原型: assign(beg, end); //将[beg, end]区间中的数据拷贝给本身 assign(n, elem);//将n个elem拷贝赋值给本身 list& operator = (const list &lst);//重载等号操作符 swap(lst);//将lst与本身的元素互换 ### 示例: ```cpp #include<iostream> #include<list> using namespace std; void print_list(const list<int>& li) { for (list<int>::const_iterator it = li.begin(); it != li.end(); it++) { cout << *it << " "; } cout << endl; } void create_list(list<int>& li) { li.push_back(10); li.push_back(20); li.push_back(30); li.push_front(40); li.push_front(50); li.push_front(60); } void text(list<int>& lt) { list<int>lt1; //区间构造 lt1.assign(lt.begin(), lt.end()); print_list(lt1); list<int>lt2;//拷贝构造 lt2 = lt; print_list(lt2); list<int>lt3;//10个100拷贝构造 lt3.assign(10, 100); print_list(lt3); cout << "交换前:" << endl; print_list(lt1); print_list(lt3); cout << "交换后:" << endl; lt3.swap(lt1); print_list(lt1); print_list(lt3); } int main() { list<int>li; //默认构造 create_list(li); print_list(li); text(li); return 0; } ``` ## 大小操作: ### 功能描述: 对list容器的大小进行操作 ### 函数原型: size();//返回容器中元素的个数 empty();//判断容器是否为空 resize(num);//重新指定容器长度为num,若容器变长,则以默认值0填充新位置;若容器变短,则末尾超出容器长度的元素被删除 resize(num, elem);//重新指定容器长度为num,若容器变长,则以elem值填充新位置;若容器变短,则末尾超出容器长度的元素被删除 ### 示例: ```cpp #include<iostream> #include<list> using namespace std; void print_list(const list<int>& li) { for (list<int>::const_iterator it = li.begin(); it != li.end(); it++) { cout << *it << " "; } cout << endl; } void create_list(list<int>& li) { li.push_back(10); li.push_back(20); li.push_back(30); li.push_front(40); li.push_front(50); li.push_front(60); } void text(list<int>& lt) { if (lt.empty()) { cout<< "list容器为空!" << endl; } else { cout << "list容器不为空!" << "容器大小为:" << lt.size() << endl; } lt.resize(10); print_list(lt); lt.resize(10, 99); print_list(lt); lt.resize(3); print_list(lt); } int main() { list<int>li; //默认构造 create_list(li); print_list(li); text(li); return 0; } ``` ## 插入和删除: ### 功能描述: 对list容器进行数据的插入和删除 ### 函数原型: 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位置的数据,返回下一个数据的元素 remove(elem);//删除容器中所以与elem值匹配的元素 ### 示例: ```cpp #include<iostream> #include<list> using namespace std; void print_list(const list<int>& li) { for (list<int>::const_iterator it = li.begin(); it != li.end(); it++) { cout << *it << " "; } cout << endl; } void create_list(list<int>& li) { li.push_back(10);//尾插 li.push_back(20); li.push_back(30); li.push_front(40);//头插 li.push_front(50); li.push_front(60); print_list(li); li.pop_back();//尾删 print_list(li); li.pop_front();//头删 print_list(li); list<int>::iterator it = li.begin();//指定位置插入 li.insert(it++, 500); print_list(li); it = li.begin();//指定位置删除 li.erase(it); print_list(li); li.push_back(900); li.push_back(900); li.push_back(900); print_list(li); li.remove(900);//删除所以包含900元素 print_list(li); } int main() { list<int>li; //默认构造 create_list(li); return 0; } ``` ## 数据存取: ### 功能描述: 对list容器中数据进行存取 ### 函数原型: front();//返回第一个元素 back();//返回最后一个元素 ### 示例: ```cpp #include<iostream> #include<list> using namespace std; void print_list(const list<int>& li) { for (list<int>::const_iterator it = li.begin(); it != li.end(); it++) { cout << *it << " "; } cout << endl; } void create_list(list<int>& li) { li.push_back(10);//尾插 li.push_back(20); li.push_back(30); li.push_front(40);//头插 li.push_front(50); li.push_front(60); print_list(li); //li[0] ,不可以利用[]访问列表元素 //li.at(0), 不可以利用at访问列表元素 //原因是list本质为链表,不是利用连续的内存空间存储数据,迭代器也是不支持连续访问的 cout << "链表第1个元素" << li.front() << "链表最后一个元素" << li.back() << endl; list<int>::iterator it = li.begin(); it++;//支持双向 it--; //it = it + 1; 不支持随机访问 //it = it - 1; } int main() { list<int>li; //默认构造 create_list(li); return 0; } ``` ## 反转与排序: ### 功能描述: 将容器中的元素反转,以及将容器中的数据进行排序 ### 函数原型: reverse();//反转链表 sort();//链表排序 ### 示例: ```cpp #include<iostream> #include<list> using namespace std; void print_list(const list<int>& li) { for (list<int>::const_iterator it = li.begin(); it != li.end(); it++) { cout << *it << " "; } cout << endl; } bool reduce(int a, int b)//降序函数 { return a > b; } void create_list(list<int>& li) { li.push_back(10);//尾插 li.push_back(20); li.push_back(30); li.push_front(40);//头插 li.push_front(50); li.push_front(60); cout << "反转前:" << endl; print_list(li); cout << "反转后:" << endl; li.reverse(); print_list(li); cout << "排序前:" << endl; print_list(li); cout << "排序后:(升序)" << endl; li.sort(); print_list(li); cout << "排序后:(降序)" << endl; li.sort(reduce); print_list(li); } int main() { list<int>li; //默认构造 create_list(li); return 0; } ``` ## list排序案例: ```cpp #include<iostream> #include<list> #include<string> using namespace std; class Preson { public: Preson(string name, int age, int height) { this->name = name; this->age = age; this->height = height; } public: string name; int age; int height; }; void print_list(const list<Preson>& li)//打印输出 { for (list<Preson>::const_iterator it = li.begin(); it != li.end(); it++) { cout <<"名字:"<<it->name << " 年龄:"<<it->age<<" 身高"<<it->height<<endl; } cout << endl; } bool preson_sort(Preson &p1, Preson &p2) { if (p1.age == p2.age) { return p1.height < p2.height; } return p1.age < p2.age; } void create_list() { list<Preson>li; Preson p1("阿狗", 4, 170); Preson p2("阿猫", 1, 168); Preson p3("阿马", 3, 176); Preson p4("阿牛", 1, 153); Preson p5("阿鸟", 5, 147); Preson p6("阿鸡", 10, 180); li.push_back(p1); li.push_back(p2); li.push_back(p3); li.push_back(p4); li.push_back(p5); li.push_back(p6); cout << "排序前"<<endl; print_list(li); cout << "排序后" << endl; li.sort(preson_sort); print_list(li); } int main() { create_list(); return 0; } ``` 最后修改:2021 年 09 月 20 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 如果文章有用,请随意打赏。