欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

C++学习笔记——STL常用容器——list

程序员文章站 2022-07-12 14:14:56
...

list容器的功能:将数据进行链式存储。

链表:一种物理存储单元上非连续的存储结构,数据元素的逻辑顺序是通过链表中的指针链接实现的。链表由一系列结点组成,结点由存储数据元素的数据域和存储下一个结点地址的指针域组成。

STL中的链表是一个双向循环链表。

list的优点:

采用动态存储分配,不会造成内存浪费和溢出;

执行插入和删除方便,修改指针的指向即可,不需要移动大量元素。

list的缺点:

空间(指针域)和时间(遍历)耗费较大。

list插入和删除元素不会造成原有的迭代器的失效。

list构造函数

函数原型:

//list采用采用模板类实现,对象的默认构造形式:
list<T> lst;

//构造函数将[beg, end)区间中的元素拷贝给本身。
list(beg,end);

//构造函数将n个elem拷贝给本身。
list(n,elem);

//拷贝构造函数。
list(const list &lst);

list赋值和交换:

函数原型:

//将[beg, end)区间中的数据拷贝赋值给本身。
assign(beg, end);

//将n个elem拷贝赋值给本身。
assign(n, elem);

//重载等号操作符
list& operator=(const list &lst);

//将lst与本身的元素互换。
swap(lst); 

list大小操作:

函数原型:

//返回容器中元素的个数
size();

//判断容器是否为空
empty();

//重新指定容器的长度为num,若容器变长,则以默认值填充新位置。 
// 如果容器变短,则末尾超出容器长度的元素被删除。
resize(num);

//重新指定容器的长度为num,若容器变长,则以elem值填充新位置。
//如果容器变短,则末尾超出容器长度的元素被删除。
​resize(num, elem); 

list插入和删除:

函数原型:

//在容器尾部加入一个元素
push_back(elem);

//删除容器中最后一个元素
pop_back();

//在容器开头插入一个元素
push_front(elem);

//从容器开头移除第一个元素
pop_front();

//在pos位置插elem元素的拷贝,返回新数据的位置。
insert(pos,elem);

//在pos位置插入n个elem数据,无返回值。
insert(pos,n,elem);

//在pos位置插入[beg,end)区间的数据,无返回值。
insert(pos,beg,end);

//移除容器的所有数据
clear();

//删除[beg,end)区间的数据,返回下一个数据的位置。
erase(beg,end);

//删除pos位置的数据,返回下一个数据的位置。
erase(pos);

//删除容器中所有与elem值匹配的元素。
remove(elem);

例子:

#include <iostream>
#include <list>
using namespace std;


void print_list(const list<int>& list1){
    for(list<int>::const_iterator it=list1.begin();it!=list1.end();it++){
        cout<<*it<<" ";
    }
    cout<<endl;
}

void test01(){
    list<int> list1;

//    尾插
    list1.push_back(10);
    list1.push_back(30);

//    头插
    list1.push_front(15);
    list1.push_front(25);
    print_list(list1);

//    尾删
    list1.pop_back();
    print_list(list1);

//    头删
    list1.pop_front();
    print_list(list1);

//    插入
    list<int>::iterator it=list1.begin();
    list1.insert(++it,16);
    print_list(list1);

//    删除
    it=list1.end();
    list1.erase(--it);
    print_list(list1);

//    移除
    list1.push_front(20);
    list1.push_front(20);
    list1.remove(20);
    print_list(list1);

//    清空
    list1.clear();
    print_list(list1);
}

int main() {
    test01();
    return 0;
}

list数据存取:

函数原型:

//返回第一个元素。
front();

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

list反转和排序:

函数原型:

//反转链表
reverse();

//链表排序
sort(); 

例子;

#include <iostream>
#include <list>
using namespace std;


void print_list(const list<int>& list1){
    for(list<int>::const_iterator it=list1.begin();it!=list1.end();it++){
        cout<<*it<<" ";
    }
    cout<<endl;
}

bool my_compare(int a,int b){
    return a>b;
}

void test01(){
    list<int> list1;

//    尾插
    list1.push_back(10);
    list1.push_back(30);

//    头插
    list1.push_front(15);
    list1.push_front(25);
    print_list(list1);
    
//    反转
    list1.reverse();
    print_list(list1);
    
//    排序,默认从小到大
    list1.sort();
    print_list(list1);
    
//    指定规则,从大到小
    list1.sort(my_compare);
    print_list(list1);
}

int main() {
    test01();
    return 0;
}

 

相关标签: c++