C++ [STL] list容器 详解

1. 什么是list容器?

C++ [STL] list容器 详解_第1张图片

2. list的初始化函数

list<int>l1;   //创建一个空链表

list<int>l2(10);  //创建一个链表其有10个空元素

list<int>l3(5,20);  //创建一个链表其有5个元素内容为20

list<int>l4(l3.begin(),l3.end());
//创建一个链表其内容为l3

list<int>l5(l4);
//创建一个链表其内容为l4

list<int>l6.assgin(4,12);
//创建一个有四个值为12的链表

list<int> li={1,2,3,4,5,6};

for(auto it=li.begin();it!=li.end();it++){
cout<<*it<<" ";
}

3. list的大小函数

empty();   //判空

size();  //返回链表元素的个数

max_size();   //返回链表能容纳元素的最大数量

resize();   //改变链表的大小

4. list的插入函数

push_front();  //在链表的最前端插入一个数据

push_back();   //在链表的最尾端插入一个数据

insert();     
//插入元素到指定位置,通过在元素之前在指定位置插入新元素来扩展向量,从而有效地增加容器大小所插入的元素数量。

//插入单一数据到指定位置:
iterator insert (iterator position, const value_type& val);

//插入一段数据到指定位置:
void insert (iterator position, size_type n, const value_type& val);

//插入一段别的容器的数据到指定位置:
template <class Inputlterator>
void insert (iterator position, Inputlterator first,Inputlterator last);  //要注意,区间的范围是前闭后开

li.insert(li.begin(),100);
//在链表的最前端插入数据100

li.insert(li.begin(),3,200);
//在链表最前端插入3个100  

list<int>k(2,50);   //创建一个新的链表,拥有2个元素(50)

li.insert(li.begin(),li.end());   //在链表v的最前端插入k的全部元素

案例:

#include
#include
using namespace std;

void Print(list<int> l)
{
for(auto i=l.begin();i!=end();i++)
{
cout<<*i<<endl;
}
cout<<endl;
}
int main()
{
list<int>l={1,2,3,4,5,6};
cout<<l.size()<<endl;
cout<<l.max_size()<<endl;

l.push_front(8);
Print(l);
l.push_back(0);
Print(l);

l.insert(l.begin(),20);
Print(l);

list<int>l1(3,11);
l.insert(++l.begin(),l1.begin(),l1.end());
Print(l);
return 0;
}

5. list的删除函数

pop_front();   //在链表的最前端删除一个数据

pop_back();    //在链表的最后端删除一个数据

erase();   //删除一个元素或者一段区间,将自动缩减空间

clear();   //清空链表

unique();   //删除链表中重复的元素

remove();   //从链表删除元素

l.erase(l.begin());    //删除对应位置的元素

l.erase(l.begin(),l.end());   //删除链表的所有元素

//要注意的是,链表的迭代器不可以进行代数运算

案例:

#include
#include

using namespace std;

void Print(list<int> l)
{
   for(auto i=l.begin();i!=l.end();i++)
   {
    cout<<(*i)<<" ";
   }
   cout<<endl;
   cout<<endl;
}

int main()
{
    list<int>l={1,2,3,4,5,6,6};
    Print(l);
    l.unique();  //或者l.remove(6);
    Print(l);

    list<int>l1(5,11);

    l.insert(++l.begin(),l1.begin(),++l1.begin());
    Print(l);

    l.erase(l.begin());
    Print(l);

    l.erase(l.begin(),l.end());  //或者list.clear();
    Print(l);
	if(!l.empty())
	{
	cout<<"链表为空"<<endl;
     }
    return 0;
}

6. list的排序函数

sort();
//让整个链表变成升序,或者自定义排序状态

template<class  Compare> 

void sort(Compare comp);

reverse();   //让升序链表变成降序

案例:

#include
#include

using namespace std;

void Print(list<int> l)
{
   for(auto i=l.begin();i!=l.end();i++)
   {
    cout<<(*i)<<" ";
   }
   cout<<endl;
   cout<<endl;
}

int cmp(const int &a,const int &b)
{
    return a>b;  //自定义降序
}
int main()
{
    list<int>l;
    for(int i=10;i>=6;i--)
    {
        l.push_back(i);
    }
    l.push_back(20);
    l.push_front(3);

    list<int>l2(l);
    Print(l);

    l.sort();
    Print(l);

    Print(l2);
    l2.sort(cmp);  //或者l2.sort(); l2.reverse();
    Print(l2);
    
    return 0;
}

7. list的访问函数

back();   //返回第一个元素
 
front();   //返回最后一个元素

get_allocator();    //返回list的配置器

8. list的其他函数

merge(list& x);   //合并两个链表
 
splice();    //合并两个链表

swap();    //交换链表

//关于splice函数,我发现了一篇很好博客,读者参考这篇博客就可以

链接: [link](链接: link)

9. 迭代器

begin();    //返回指向第一个元素的迭代器
 
end();      //返回指向最后一个元素的迭代器

rbegin();    //返回指向第一个元素的逆向迭代器

rend();      //返回指向最后一个元素的逆向迭代器

10. 链表案例

利用list将Person自定义数据类型进行排序,Person中属性有姓名、年龄、身高。排序规则,按照年龄进行升序,如果年龄相同按照身高进行降序。

#include 
#include 
#include 
using namespace std;
class Person
{
public:
Person(string name, int age, int height){
    this->m_age = age;
	this->m_height = height;
	this->m_name = name;
}
int m_age;
int m_height;
string m_name;
};

bool compare(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;
}
}

int main()
{
list<Person>L;
Person p1("唐僧".35,175);
Person p2("孙悟空".45, 100);
Person Da1("沙悟净",40,170);

L.push_back(p2);
L.push_back(p3);
L.push_back(p4);
	
cout<<"排序前: "<<endl;
for (auto it = L.begin(); it != L.end(); jt++)   //遍历—遍
{
cout <<"姓名:"<<(*it).m_name <<" 年龄:"<<(*it).m_age
	<<"身高:"<<(*it).m_height << endl;
}
L.sort(compare);
	
cout <<"排序后"<<endl;
for (auto it =L.begin(); it !- L.end(); it++){
cout <<"姓名:" <<(*it).m_name <<"年龄:."<<(*it).m_age
	<<"身高:" <<(*it).m_height <<endl;
}
return O;
}


你可能感兴趣的:(c++,list,开发语言)