c++中的list容器 Posted on 2022-12-09 21:56:18 2022-12-09 21:56:18 by Author 摘要 c++ 学习笔记,list容器的学习笔记 ##### list容器 list的优点: - 采用动态存储的分配,不会造成内存浪费和溢出 - 链表执行插入和删除操作十分方便,修改指针即可,不需要移动大量的元素 list的缺点: - 遍历耗费较大 list一个重要属性,插入和删除操作不会造成原有list迭代器的失效。 STL中List和vector是两个最长被使用的容器 ##### list构造函数: 函数原型: - list<T> lst; - list<beg,end>;//采用函数将(beg,end)区间的元素拷贝给本身 - list(n,elem);//构造函数将n个elem拷贝给本身 - list(const list&list);//拷贝构造函数 - ```c++ #include<iostream> #include<string> #include<list> using namespace std; void printList(const list<int>&l){ for(list<int>::const_iterator it=l.begin();it!=l.end();it++){ cout<<*it<<" "; } cout<<endl; } void test01(){ list<int> ll; ll.push_back(11); ll.push_back(22); ll.push_back(33); ll.push_back(44); printList(ll); //区间迭代器 list<int>l2(ll.begin(),ll.end()); printList(l2); //copy构造 list<int>l3(l2); printList(l3); //n个elem list<int>l4(10,1000); printList(l4); } int main(){ test01(); return 0; } ``` ##### list赋值和交换操作 函数原型: - assign(beg,end);//区间构造 - assign(n,elem);//将n个elem拷贝赋值给本身 - list&operator=(const list&list);//重载等号操作 - swap(lst);//将lst本身元素互换 - ```c++ #include<iostream> #include<string> #include<list> using namespace std; void printList(const list<int>&l){ for(list<int>::const_iterator it=l.begin();it!=l.end();it++){ cout<<*it<<" "; } cout<<endl; } void test01(){ list<int> ll; ll.push_back(11); ll.push_back(22); ll.push_back(33); ll.push_back(44); printList(ll); //operator=赋值 list<int> l2=ll; printList(l2); list<int> l3; l3.assign(l2.begin(),l2.end()); printList(l3); list<int> l4; l4.assign(10,10000); printList(l4); } void test02(){ list<int> ll; ll.push_back(11); ll.push_back(22); ll.push_back(33); ll.push_back(44); cout<<"交换前"<<endl; printList(ll); list<int> l2; l2.assign(10,100); printList(l2); cout<<"交换后"<<endl; l2.swap(ll); printList(ll); printList(l2); } int main(){ test01(); test02(); return 0; } ``` #### list插入和删除 - 头部插入和头部删除,尾部删除和尾部插入 - remove(elem);//删除容器中所有与elem相同的元素 - ```c++ #include<iostream> #include<string> #include<list> using namespace std; void printList(const list<int>&l){ for(list<int>::const_iterator it=l.begin();it!=l.end();it++){ cout<<*it<<" "; } cout<<endl; } void test01(){ list<int> ll; ll.push_back(11); ll.push_back(22); ll.push_back(33); ll.push_back(44); ll.push_front(100); printList(ll); //两端的操作 ll.pop_back(); ll.pop_front(); printList(ll); //插入,迭代器 ll.insert(ll.begin(),1000); printList(ll); //删除 ll.erase(ll.begin()); printList(ll); ll.push_back(100000); ll.push_back(100000); ll.push_back(100000); printList(ll); //移除,删除所有匹配的数字 ll.remove(100000); printList(ll); } int main(){ test01(); return 0; } ``` ##### list存取 - front(); - back(); - 没有[]或者at()方式随机访问,因为他是双向链表 - ```c++ #include<iostream> #include<string> #include<list> using namespace std; void printList(const list<int>&l){ for(list<int>::const_iterator it=l.begin();it!=l.end();it++){ cout<<*it<<" "; } cout<<endl; } void test01(){ list<int> ll; ll.push_back(11); ll.push_back(22); ll.push_back(33); ll.push_back(44); ll.push_front(100); printList(ll); cout<<ll.front()<<endl; cout<<ll.back()<<endl; } int main(){ test01(); return 0; } ``` - list容器反转和排序 - reverse()和sort() - 排序是ll.sort();//ll是list对象 - ```c++ #include<iostream> #include<string> #include<list> #include<algorithm> using namespace std; void printList(const list<int>&l){ for(list<int>::const_iterator it=l.begin();it!=l.end();it++){ cout<<*it<<" "; } cout<<endl; } bool myCompare(int v1,int v2){ //降序,让第一个数大于第二个数 return v1>v2; } void test01(){ list<int> ll; ll.push_back(11); ll.push_back(22); ll.push_back(33); ll.push_back(44); ll.push_back(5); ll.push_front(100); printList(ll); ll.reverse(); printList(ll); ll.sort(); printList(ll); ll.sort(myCompare); printList(ll); } int main(){ test01(); return 0; } ``` ##### list排序案例 ```c++ #include<iostream> #include<string> #include<list> using namespace std; class Person{ public: Person(string name,int height,int age){ this->m_name = name; this->m_age = age; this->m_height = height; } string m_name; int m_height; int m_age; }; void printList(const list<Person>&l){ for(list<Person>::const_iterator it=l.begin();it!=l.end();it++){ cout<<"姓名: "<<(*it).m_name<<" 年龄:"<<(*it).m_age<<" 升高:"<<(*it).m_height<<endl; } cout<<endl; } bool myCompare(Person &p1,Person& p2){ //按照年龄升序,年龄相同,升高降序 //年龄相同,升高降序 if(p1.m_age==p2.m_age){ return p1.m_height>p2.m_height; }else{ //按照年龄升序, return p1.m_age<p2.m_age; } } void test01(){ list<Person> ll; Person p1("刘备",35,175); Person p2("孙权",45,160); Person p3("曹操",25,178); Person p4("赵云",22,156); Person p5("张飞",36,145); Person p6("关羽",36,200); ll.push_back(p1); ll.push_back(p2); ll.push_back(p3); ll.push_back(p4); ll.push_back(p5); ll.push_back(p6); printList(ll); cout<<"排序后的效果----------:"<<endl; ll.sort(myCompare); printList(ll); } int main(){ test01(); return 0; } ```
{{ item.content }}
{{ child.content }}