【STL】list介绍(附与vector的比较)

news2025/4/15 10:57:13

文章目录

  • 1.关于list
  • 2.使用
    • 2.1 list的构造
    • 2.2 list 迭代器的使用
    • 2.3 list 容量操作
      • 2.3.1 size()
      • 2.3.2 empty()
      • 2.3.3 resize()
    • 2.4 list 元素访问
      • 2.4.1 front()
      • 2.4.2 back()
    • 2.5 list 修改操作
      • 2.5.1 push_front()
      • 2.5.2 pop_front()
      • 2.5.3 push_back()
      • 2.5.4 pop_back()
      • 2.5.5 insert()
      • 2.5.6 erase()
      • 2.5.7 swap()
      • 2.5.8 clear()
    • 2.6其它
      • 2.6.1 remove()
      • 2.6.2 remove_if()
      • 2.6.3 unique()
      • 2.6.4 sort()
      • 2.6.5 merge()
      • 2.6.6 reverse()
  • 3. vector和list对比

1.关于list

​ list也是STL提供的一个容器,其底层是一个带头双向循环链表,因此,其优缺点如下:

优点:

  1. 插入和删除效率高:在链表的任意位置插入或删除元素的时间复杂度为 O (1),这使得list在需要频繁插入和删除元素的场景下非常高效。
  2. 内存管理灵活list的元素在内存中不是连续存储的,因此可以灵活地分配和释放内存,避免了内存碎片的问题。

缺点:

  1. 随机访问效率低:由于list是双向链表,不支持随机访问,要访问第 n 个元素,需要从头或尾开始遍历链表。
  2. 空间开销大:每个元素除了存储自身的数据外,还需要额外的指针来指向前一个和后一个元素,因此空间开销较大。

在这里插入图片描述

2.使用

​ 这里也只介绍常用的一些接口。

2.1 list的构造

1.声明及说明

构造函数声明说明
list(size_type n,const value_type& val = value_type())构造包含n个val元素的list
list()构造空的list
list(const list& x)拷贝构造
list (InputIterator first, InputIterator last)[first,last)区间元素构造

2.示例

#include <iostream>
#include <list> //注意包含头文件<list>
using namespace std;

template <class T>
void print_list(list<T>& lt)
{
    for (auto& e : lt)
    {
        cout << e << " ";
    }
    cout << endl;
}

void list_test1()
{
    list<int> lt1;                         // 构造空的lt1
    list<int> lt2(5, 10);                 // 4个值为10的元素构造lt2
    list<int> lt3(lt2.begin(), lt2.end()); // 用lt2的[begin(), end())区间构造lt3
    list<int> lt4(lt3);                    // 用lt3拷贝构造lt4
	
    list<int> lt5{ 1,2,3,4,5 };           //列表格式构造 C++11支持
   
    print_list(lt1);//  
    print_list(lt2);//10 10 10 10 10
    print_list(lt3);//10 10 10 10 10
    print_list(lt4);//10 10 10 10 10
    
    print_list(lt5);//1 2 3 4 5
}


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

2.2 list 迭代器的使用

1.声明及说明

声明说明
begin() + end()返回第一个元素的迭代器+返回最后一个元素下一个位置的迭代器
rbegin() + rend()返回反向第一个元素的reverse_iterator,返回反向最后一个元素下一个位置的reverse_iterator

在这里插入图片描述

2.示例

void list_test2()
{
    list<int> lt{ 1,2,3,4,5 };           //列表格式构造 C++11支持

    list<int>::iterator it = lt.begin();
    while (it != lt.end())
    {
        cout << *it << " ";
        ++it;
    }
    cout << endl;
	//输出:1 2 3 4 5
    
    list<int>::reverse_iterator rit = lt.rbegin();
    while (rit != lt.rend())
    {
        cout << *rit << " ";
        ++rit;
    }
    cout << endl;
    //输出:5 4 3 2 1
}

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

2.3 list 容量操作

2.3.1 size()

1.声明及功能

声明功能
size_type size() const返回list内有效元素个数

2.示例

void list_test3()
{
    list<int> lt{ 1,2,3,4,5 };
    cout << lt.size() << endl;  //5
}

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

2.3.2 empty()

1.声明及功能

声明功能
bool empty() const检测list是否为空

2.示例

void list_test4()
{
    list<int> lt1;
    list<int> lt2{ 1,2,3,4,5 };
    if (lt1.empty())
    {
        cout << "lt1 is empty" << endl;
    }
    else
    {
        cout << "lt1 is not empty" << endl;
    }
	//输出:lt1 is empty
    if (lt2.empty())
    {
        cout << "lt2 is empty" << endl;
    }
    else
    {
        cout << "lt2 is not empty" << endl;
    }
    //输出:lt2 is not empty
}

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

2.3.3 resize()

1.声明及功能

声明功能
void resize (size_type n);将list的size调整为n。如果n大于当前list的size(),则在列表末尾插入默认构造的元素。如果n小于当前list的size(),则删除超出n的元素。
void resize (size_type n, const value_type& val);将list的size调整为n。如果n大于当前列表的size(),则在列表末尾插入足够数量的值为val的元素。如果n小于当前列表的大小,则删除超出n的元素。

2.示例

void list_test5()
{
    list<int> lt1(5, 1);
    list<int> lt2(5, 2);
    print_list(lt1);//1 1 1 1 1
    print_list(lt2);//2 2 2 2 2

    lt1.resize(10, 2);
    print_list(lt1);//1 1 1 1 1 2 2 2 2 2
    lt1.resize(2, 0);
    print_list(lt1);//1 1

    lt2.resize(1);
    print_list(lt2);//2
    lt2.resize(10);
    print_list(lt2);//2 0 0 0 0 0 0 0 0 0 
    
}

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

2.4 list 元素访问

2.4.1 front()

1.声明及功能

声明功能
reference front();返回list第一个节点的值的引用

2.示例

void list_test6()
{
    list<int> lt{ 1,2,3,4,5 };
    print_list(lt);//1 2 3 4 5

    ++lt.front();//2 2 3 4 5
    print_list(lt);

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

2.4.2 back()

1.声明及功能

声明功能
reference back();返回list的最后一个节点中值的引用

2.示例

void list_test7()
{
    list<int> lt{ 1,2,3,4,5 };
    print_list(lt);//1 2 3 4 5

    --lt.back();
    print_list(lt);//1 2 3 4 4

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

2.5 list 修改操作

2.5.1 push_front()

1.声明及功能

声明功能
void push_front (const value_type& val);在list首元素前插入值为val的元素

2.示例

void list_test8()
{
    list<int> lt{ 1,2,3,4,5 };
    print_list(lt);//1 2 3 4 5

    lt.push_front(0);
    print_list(lt);//0 1 2 3 4 5

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

2.5.2 pop_front()

1.声明及功能

声明功能
void pop_front();删除list中第一个元素

2.示例

void list_test9()
{
    list<int> lt{ 1,2,3,4,5 };
    print_list(lt);//1 2 3 4 5 

    lt.pop_front();
    print_list(lt);//2 3 4 5

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

2.5.3 push_back()

1.声明及功能

声明功能
void push_back (const value_type& val);在list尾部插入值为val的元素

2.示例

void list_test10()
{
    list<int> lt;
    lt.push_back(1);
    lt.push_back(2);
    lt.push_back(3);
    lt.push_back(4);
    lt.push_back(5);
    print_list(lt);//1 2 3 4 5
}
int main()
{
    list_test10();
    return 0;
}

2.5.4 pop_back()

1.声明及功能

声明功能
void pop_back();删除list中最后一个元素

2.示例

void list_test11()
{
    list<int> lt{ 1,2,3,4,5 };
    print_list(lt);//1 2 3 4 5

    lt.pop_back();
    lt.pop_back();
    lt.pop_back();
    lt.pop_back();
    print_list(lt);//1

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

2.5.5 insert()

1.声明及功能

声明功能
iterator insert (iterator position, const value_type& val);在position位置前插入值为val的元素
void insert (iterator position, size_type n, const value_type& val);在position位置前插入n个值为val的元素
template < class InputIterator > void insert (iterator position, InputIterator first, InputIterator last);在position位置前插入指定区域[first,last)对应值的元素

2.示例

void list_test12()
{
    list<int> lt{ 1,2,3,4,5 };
    list<int> lt1{ 1,1,1,1,1 };
    print_list(lt);//1 2 3 4 5

    list<int>::iterator it = ++lt.begin();
    lt.insert(it, 0);
    print_list(lt);//1 0 2 3 4 5

    lt.insert(lt.begin(), 3, 0);
    print_list(lt);//0 0 0 1 0 2 3 4 5

    lt.insert(lt.begin(), lt1.begin(), lt1.end());
    print_list(lt);//1 1 1 1 1 0 0 0 1 0 2 3 4 5
}
int main()
{
    list_test12();
    return 0;
}

2.5.6 erase()

1.声明及功能

声明功能
iterator erase (iterator position);删除position位置的值,并返回position下一个位置的iterator
iterator erase (iterator first, iterator last);删除指定区间[first,last)的元素并返回last位置的iterator

在这里插入图片描述

2.示例

void list_test13()
{
    list<int> lt{ 1,2,3,4,5,6,7,8,9,10 };
    print_list(lt);//1 2 3 4 5 6 7 8 9 10

    list<int>::iterator it1 = lt.begin();
    while (it1 != lt.end())
    {
        if (*it1 == 5)
        {
            it1 = lt.erase(it1); //it指向值为6的位置
            cout << *it1 << endl;//6
            continue;
        }
        it1++;
    }
    print_list(lt);//1 2 3 4 5 7 8 9 10

    list<int>::iterator first = ++lt.begin();//指向2的位置
    list<int>::iterator last = --lt.end(); //指向10的位置
    
    list<int>::iterator it2 = lt.erase(first, last);//删除[first,last) it2指向last的位置即9的位置
    cout << *it2 << endl;//10
    print_list(lt);//1 10
}
int main()
{
    list_test13();
    return 0;
}

2.5.7 swap()

1.声明及功能

声明功能
void swap (list& x);交换两个list

2.示例

void list_test14()
{
    list<int> lt1{ 1,2,3,4,5 };
    list<int> lt2{ 5,4,3,2,1 };
    print_list(lt1);//1 2 3 4 5
    print_list(lt2);//5 4 3 2 1

    lt1.swap(lt2);
    print_list(lt1);//5 4 3 2 1
    print_list(lt2);//1 2 3 4 5
}
int main()
{
    list_test14();
    return 0;
}

2.5.8 clear()

1.声明及功能

声明功能
void clear();清空list中的有效元素(不包括头节点)

2.示例

void list_test15()
{
    list<int> lt{ 1,2,3,4,5 };
    print_list(lt);//1 2 3 4 5

    lt.clear();
    print_list(lt);// 
}
int main()
{
    list_test15();
    return 0;
}

2.6其它

2.6.1 remove()

1.声明及功能

声明功能
void remove (const value_type& val);删除值为val的元素

2.示例

void list_test16()
{
    list<int> lt{ 10,20,30,40,50 };
    print_list(lt);//10 20 30 40 50

    lt.remove(30);//有30则删除
    print_list(lt);//10 20 40 50

    lt.remove(1);//无1则不删除
    print_list(lt);//10 20 40 50
    
}
int main()
{
    list_test16();
    return 0;
}

2.6.2 remove_if()

1.声明及功能

声明功能
template < class Predicate> void remove_if (Predicate pred);删除满足()中条件的值,其中可以是函数指针或者函数对象

2.示例

bool if_even(int n)
{
    return n % 2 != 0;
}

void list_test17()
{
    list<int> lt{ 1,2,3,4,5 };
    print_list(lt);//1 2 3 4 5

    lt.remove_if(if_even);//删除奇数
    print_list(lt);//2 4
}
int main()
{
    list_test17();
    return 0;
}

2.6.3 unique()

1.声明及功能

声明功能
void unique();删除list中连续重复的值,一段连续值只保留一个(注意区分,不是完全去重)

2.示例

void list_test18()
{
    list<int> lt{ 1,1,1,2,2,2,3,3,4,5,5 };
    print_list(lt);//1 1 1 2 2 2 3 3 4 5 5 

    lt.unique();//连续重复的数,仅保留一个
    print_list(lt);//1 2 3 4 5 

    list<int> lt1{ 1,1,1,2,2,2,1,1,2,2,3,3,4,5,5 };
    print_list(lt1);1 1 1 2 2 2 1 1 2 2 3 3 4 5 5 

    lt1.unique();
    print_list(lt1);//1 2 1 2 3 4 5
}

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

2.6.4 sort()

1.声明及功能

声明功能
void sort();默认按升序排序
template < class Compare> void sort (Compare comp);按comp方法进行排序

2.示例

struct cmp
{
    bool operator()(int a,int b) {
        return a > b;
    }
};
void list_test19()
{
    list<int> lt{ 3,1,2,5,4,0,2 };
    print_list(lt);//3 1 2 5 4 0 2

    lt.sort();//默认升序排列
    print_list(lt);//0 1 2 2 3 4 5

    lt.sort(cmp());//自定义降序排列
    print_list(lt);//5 4 3 2 2 1 0
}
int main()
{
    list_test19();
    return 0;
}

2.6.5 merge()

1.声明及功能

声明功能
void merge (list& x);合并两个list为一个有序的list(仅适用于两个已排序的list(升序))

2.示例

void list_test20()
{
    list<int> lt1{ 1,2,6,4,5 };
    list<int> lt2{ 0,4,21,3,4 };

    lt1.sort();
    lt2.sort();
    lt1.merge(lt2);//将lt2合并到lt1中,合并成一个升序list

    print_list(lt1);//0 1 2 3 4 4 4 5 6 21
    print_list(lt2);//
}
int main()
{
    list_test20();
    return 0;
}

2.6.6 reverse()

1.声明及功能

声明功能
void reverse();翻转list

2.示例

void list_test21()
{
    list<int> lt{ 1,2,3,4,5 };
    print_list(lt);//1 2 3 4 5

    lt.reverse();
    print_list(lt);//5 4 3 2 1
}
int main()
{
    list_test21();
    return 0;
}

3. vector和list对比

对比vectorlist
底层结构动态顺序表带头双向循环链表
访问支持随机访问,可使用首地址+下标,[]形式不能随机访问
插入删除任意位置插入删除效率较低,需挪动元素任意位置插入删除效率较高
空间利用率底层为连续空间,空间利用率高,缓存利用率高节点动态开辟,容易造成内存碎片,空间利用率低,缓存利用率低
迭代器原生态指针指针进行了封装
迭代器失效容器相关操作都可能导致迭代器失效,如插入引起扩容、删除元素等时插入元素不会导致迭代器失效,删除节点会导致且只影响当前迭代器
使用场景想进行随机访问,不关心插入删除效率时有大量插入删除场景,不在意随机访问效率时

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2331042.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Ansible:roles角色

文章目录 Roles角色Ansible Roles目录编排Roles各目录作用创建 roleplaybook调用角色调用角色方法1&#xff1a;调用角色方法2&#xff1a;调用角色方法3&#xff1a; roles 中 tags 使用实战案例 Roles角色 角色是ansible自1.2版本引入的新特性&#xff0c;用于层次性、结构化…

找不到导入的项目“xxx\QtMsBuild\Qt.props”。请确认 Import 声明“$(QtMsBuild)\Qt.props”中计算结果为

系列文章目录 文章目录 系列文章目录前言一、问题原因 前言 新建的项目visual studio2022 使用Qt vs tools 找不到导入的项目“E:\osgEarth\DigitalSimulationPlatform\DigitalSimulationPlatform\QtMsBuild\Qt.props”。 请确认 Import 声明“$(QtMsBuild)\Qt.props”中计算结…

2025 年福建交安安全员考试:结合本省交通特点备考​

福建地处东南沿海&#xff0c;交通建设具有独特特点&#xff0c;这对交安安全员考试备考意义重大。在桥梁建设方面&#xff0c;由于面临复杂的海洋环境&#xff0c;桥梁的防腐、防台风等安全措施成为重点。考生在学习桥梁施工安全知识时&#xff0c;要特别关注福建本地跨海大桥…

UE5 蓝图里的声音

文章目录 支持的格式设置循环播放在场景中放置音频设置音频的衰减与不衰减在UI动画中播放声音使用蓝图节点播放声音按钮本身就可以播放声音 支持的格式 支持&#xff1a;WAV 不支持&#xff1a;MP3 设置循环播放 双击音频&#xff0c;打开音频设置&#xff0c;勾选Looping …

「合诚」携手企企通共建新材料和健康产业采购数智化新生态

在科技革命与产业变革深度融合的时代背景下&#xff0c;新材料与健康产业正迎来数字化、智能化的快速发展。 技术突破与消费升级的双重驱动&#xff0c;推动着行业不断创新&#xff0c;同时也对企业的供应链管理提出了更高要求。 1、合诚&#xff1a;聚焦新材料与健康产业&am…

java+postgresql+swagger-多表关联insert操作(七)

入参为json&#xff0c;然后根据需要对多张表进行操作&#xff1a; 入参格式&#xff1a; [{"custstoreName":"swagger-测试经销商01","customerName":"swagger-测试客户01","propertyNo":"swaggertest01",&quo…

Git版本管理系列:(一)使用Git管理单分支

目录 基础概念介绍仓库的创建创建隐藏目录添加代码到暂存区提交代码到仓库提交记录查询比较差异标签文件删除版本回退总结 Git‌ 是一个分布式版本控制系统&#xff08;DVCS&#xff09;&#xff0c;用于跟踪文件的变更并协调多人协作开发‌&#xff0c;由 Linus Torvalds 于 2…

mapbox基础,加载ESRI OpenStreetMap开放街景标准风格矢量图

👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:mapbox 从入门到精通 文章目录 一、🍀前言1.1 ☘️mapboxgl.Map 地图对象1.1 ☘️mapboxgl.Map style属性二、🍀加载ESRI OpenStreetMap开放街景标准风…

WGAN-GP 原理及实现(pytorch版)

WGAN-GP 原理及实现 一、WGAN-GP 原理1.1 WGAN-GP 核心原理1.2 WGAN-GP 实现步骤1.3 总结 二、WGAN-GP 实现2.1 导包2.2 数据加载和处理2.3 构建生成器2.4 构建判别器2.5 训练和保存模型2.6 图片转GIF 一、WGAN-GP 原理 Wasserstein GAN with Gradient Penalty (WGAN-GP) 是对…

IntelliJ IDEA使用技巧(json字符串格式化)

文章目录 一、IDEA自动格式化json字符串二、配置/查找格式化快捷键 本文主要讲述idea中怎么将json字符串转换为JSON格式的内容并且有层级结构。 效果&#xff1a; 转换前&#xff1a; 转换后&#xff1a; 一、IDEA自动格式化json字符串 步骤一&#xff1a;首先创建一个临…

SvelteKit 最新中文文档教程(18)—— 浅层路由和 Packaging

前言 Svelte&#xff0c;一个语法简洁、入门容易&#xff0c;面向未来的前端框架。 从 Svelte 诞生之初&#xff0c;就备受开发者的喜爱&#xff0c;根据统计&#xff0c;从 2019 年到 2024 年&#xff0c;连续 6 年一直是开发者最感兴趣的前端框架 No.1&#xff1a; Svelte …

集成nacos2.2.1出现的错误汇总

总结 1.jdk问题 jdk要一致 2.idea使用问题 idea启动nacos要配置&#xff0c;idea启动类要启动两次&#xff0c;并配置两次vm参数 3.项目依赖问题 依赖要正确添加&#xff0c;有的模块就是不能用公共模块的pom配置&#xff0c;需要独立配置&#xff0c;先后启动顺序也要注意…

LabVIEW 开发如何降本增效

在 LabVIEW 开发领域&#xff0c;如何在确保项目质量的同时降低开发成本&#xff0c;是众多企业和开发者共同关注的焦点。这不仅关乎资源的高效利用&#xff0c;更影响项目的投资回报率和市场竞争力。下面&#xff0c;我们将从多个维度深入剖析降本策略&#xff0c;并结合具体案…

Tomcat 负载均衡

目录 二、Tomcat Web Server 2.1 Tomcat 部署 2.1.1 Tomcat 介绍 2.1.2 Tomcat 安装 2.2 Tomcat 服务管理 2.2.1 Tomcat 启停 2.2.2 目录说明 2.2.3编辑主页 2.3 Tomcat管理控制台 2.3.1开启远程管理 2.3.2 配置远程管理密码 三、负载均衡 3.1 重新编译Nginx 3.1.1 确…

4月8日日记

今天抖音刷到一个视频 记了一下笔记 想做自媒体&#xff0c;直播&#xff0c;抖音是最大的平台&#xff0c;但是我的号之前因为跟人互喷被封号了 今天想把实名认证转移到新号上&#xff0c;试了一下竟然这次成功了&#xff0c;本以为能开直播了但是 还是因为之前的号有违规记…

【JavaScript】十六、事件捕获和事件冒泡

文章目录 1、事件流2、事件捕获3、事件捕获4、阻止冒泡5、解绑事件6、鼠标经过事件的区别7、两种事件注册语法的区别 1、事件流 先举个形象的例子&#xff1a;你去西安大雁塔旅游 出发找目的地时&#xff1a;先从你家出发&#xff0c;到陕西省西安市&#xff0c;再到雁塔区&a…

基于 Spring Boot 瑞吉外卖系统开发(一)

基于 Spring Boot 瑞吉外卖系统开发&#xff08;一&#xff09; 系统概述 系统功能 技术选型 初始项目和数据准备 初始项目和SQL文件下载 创建数据库并导入数据 打开reggie项目 运行效果 主函数启动项目&#xff0c;访问URL&#xff1a; http://127.0.0.1:8080/backend/pag…

WordPress超简洁的主题:果果CMS主题

果果CMS是基于WordPress开发的超精简的一款主题&#xff0c;它在原有的特性上添加了许多新特性&#xff0c;例如&#xff1a;随机文章、随机标签、随机分类、广告、友情链接等。 新版特性&#xff1a; 小&#xff1a;主题安装包文件大小只有140.48KB。少&#xff1a;主题最小…

leetcode13.罗马数字转整数

遍历&#xff0c;下一个值不大于当前值就加上当前值&#xff0c;否则就减去当前值 class Solution {public int romanToInt(String s) {Map<Character, Integer> map Map.of(I, 1,V, 5,X, 10,L, 50,C, 100,D, 500,M, 1000);int sum 0;for (int i 0; i < s.length(…

线程安全问题的原因与解决方案总结

目录 一 什么是线程安全&#xff1f; 二 线程安全问题的实例 三 线程安全问题的原因 1.多个线程修改共享数据 2.抢占式执行 3.修改操作不是原子的 4.内存可见性问题 5.指令重排序 四 解决方案 1.同步代码块 2.同步方法 3.加锁lock解决问题 一 什么是线程安全&…