Python及C++中的列表

news2025/4/14 17:26:52

一、Python中的列表(List)

Python的列表是动态数组,内置于语言中,功能强大且易用,非常适合算法竞赛。

1. 基本概念
  • 定义:列表是一个有序、可变的序列,可以存储任意类型的元素(整数、字符串、甚至其他列表等)。
  • 声明方式
    my_list = []  # 空列表
    my_list = [1, 2, 3]  # 包含元素的列表
    mixed_list = [1, "hello", 3.14]  # 混合类型
    
  • 特点
    • 动态大小:可以随时添加或删除元素,无需预先指定大小。
    • 可变性:可以修改列表中的元素。
    • 索引:支持正向索引(从0开始)和负向索引(从-1开始倒数)。
    • 内存:Python列表内部是动态数组,扩容时会分配更多空间(通常是当前大小的1.5到2倍)。
2. 常用操作

以下是Python列表的核心操作,时间复杂度标注在括号中:

  • 访问元素my_list[i] (O(1))
    print(my_list[0])  # 访问第一个元素
    print(my_list[-1])  # 访问最后一个元素
    
  • 修改元素my_list[i] = value (O(1))
    my_list[0] = 10  # 将第一个元素改为10
    
  • 追加元素append(value) (均摊O(1))
    my_list.append(4)  # 在末尾添加4
    
  • 插入元素insert(index, value) (O(n),因为需要移动元素)
    my_list.insert(1, 5)  # 在索引1处插入5
    
  • 删除元素
    • pop(index):删除并返回指定索引的元素,默认删除末尾(O(1)末尾,O(n)其他位置)
      my_list.pop()  # 删除末尾元素
      my_list.pop(0)  # 删除第一个元素
      
    • remove(value):删除第一个匹配的值(O(n),因为需要查找)
      my_list.remove(2)  # 删除值为2的元素
      
  • 切片my_list[start:end:step] (O(k),k是切片长度)
    print(my_list[1:3])  # 获取索引1到2的子列表
    print(my_list[::-1])  # 反转列表
    
  • 长度len(my_list) (O(1))
  • 排序sort()(原地排序,O(n log n))或sorted()(返回新列表)
    my_list.sort()  # 默认升序
    my_list.sort(reverse=True)  # 降序
    new_list = sorted(my_list)  # 返回排序后的新列表
    
  • 查找value in my_list (O(n))
    if 3 in my_list:
        print("Found")
    
3. 高级用法
  • 列表推导式:快速生成列表。
    squares = [x**2 for x in range(5)]  # [0, 1, 4, 9, 16]
    evens = [x for x in my_list if x % 2 == 0]  # 提取偶数
    
  • 嵌套列表:实现二维数组(矩阵)。
    matrix = [[1, 2], [3, 4]]
    print(matrix[0][1])  # 访问第1行第2列
    
    注意:二维列表初始化时要小心浅拷贝问题:
    # 错误:所有行指向同一对象
    matrix = [[0] * 3] * 3
    # 正确:
    matrix = [[0 for _ in range(3)] for _ in range(3)]
    
4. 竞赛中的应用
  • 动态数组:Python列表适合大多数需要动态调整大小的场景,如存储输入数据。
  • 栈和队列:用append()pop()实现栈,用append()pop(0)实现队列(不过pop(0)是O(n),建议用collections.deque优化队列操作)。
  • 排序和搜索:内置的sort()sorted()非常高效,适合排序相关问题。
  • 多维数组:处理矩阵、图的邻接表等。
5. 注意事项
  • 性能pop(0)insert(0, value)是O(n),如果需要频繁操作列表头部,考虑用collections.deque
  • 内存:列表动态扩容可能导致内存开销,尽量预估大小。
  • 浅拷贝 vs 深拷贝
    a = [1, 2, 3]
    b = a  # 浅拷贝,指向同一对象
    c = a.copy()  # 深拷贝(一级)
    import copy
    d = copy.deepcopy(a)  # 完全深拷贝(多级嵌套)
    

二、C++中的列表(std::vector)

C++没有直接的“列表”概念,但std::vector是最接近Python列表的动态数组结构,广泛用于算法竞赛。C++还有std::list(双向链表),但竞赛中极少使用,因为链表操作较慢。

1. 基本概念
  • 定义std::vector是C++标准模板库(STL)中的动态数组,支持随机访问和动态调整大小。
  • 头文件:需要包含<vector>
    #include <vector>
    using namespace std;
    
  • 声明方式
    vector<int> vec;  // 空向量
    vector<int> vec = {1, 2, 3};  // 初始化
    vector<int> vec(5, 0);  // 5个0
    
  • 特点
    • 动态大小:可以自动扩容,类似Python列表。
    • 类型安全:必须指定元素类型(如intdouble等)。
    • 连续内存:元素存储在连续内存中,支持随机访问(O(1))。
    • 扩容机制:当容量不足时,分配更大内存(通常2倍),拷贝元素,释放旧内存。
2. 常用操作

以下是std::vector的核心操作,时间复杂度标注在括号中:

  • 访问元素vec[i]vec.at(i) (O(1))
    cout << vec[0] << endl;  // 第一个元素
    cout << vec.back() << endl;  // 最后一个元素
    
    注意vec[i]不检查越界,vec.at(i)会抛异常。
  • 修改元素vec[i] = value (O(1))
    vec[0] = 10;
    
  • 追加元素push_back(value) (均摊O(1))
    vec.push_back(4);  // 在末尾添加4
    
  • 删除元素
    • pop_back():删除末尾元素(O(1))
      vec.pop_back();
      
    • erase(iterator):删除指定位置元素(O(n),因为需要移动元素)
      vec.erase(vec.begin());  // 删除第一个元素
      vec.erase(vec.begin() + 2);  // 删除第3个元素
      
  • 插入元素insert(iterator, value) (O(n),因为需要移动元素)
    vec.insert(vec.begin() + 1, 5);  // 在索引1处插入5
    
  • 大小和容量
    • size():返回元素个数(O(1))
    • capacity():返回当前分配的内存大小(O(1))
    • resize(n):调整大小,不足补默认值,多了截断
    • reserve(n):预分配内存,避免频繁扩容
      vec.reserve(100);  // 预分配100个元素的空间
      
  • 清空clear() (O(1),仅清空元素,不释放内存)
    vec.clear();
    
  • 排序:需要<algorithm>库的sort函数(O(n log n))
    #include <algorithm>
    sort(vec.begin(), vec.end());  // 升序
    sort(vec.begin(), vec.end(), greater<int>());  // 降序
    
  • 查找find或手动遍历(O(n))
    auto it = find(vec.begin(), vec.end(), 3);
    if (it != vec.end()) cout << "Found" << endl;
    
3. 高级用法
  • 迭代器:用于遍历或操作。
    for (auto it = vec.begin(); it != vec.end(); ++it) {
        cout << *it << " ";
    }
    
    或用范围for循环(C++11):
    for (int x : vec) {
        cout << x << " ";
    }
    
  • 二维向量:实现矩阵。
    vector<vector<int>> matrix(3, vector<int>(3, 0));  // 3x3矩阵,初始化为0
    matrix[0][1] = 5;  // 修改第1行第2列
    
  • 自定义比较:排序时可以传递比较函数。
    sort(vec.begin(), vec.end(), [](int a, int b) { return a > b; });  // 降序
    
4. 竞赛中的应用
  • 动态数组vector适合需要动态调整大小的场景,如存储图的邻接表。
  • :用push_back()pop_back()实现栈。
  • 排序和搜索:结合sortbinary_search处理有序数据。
  • 矩阵和图:二维vector用于表示矩阵或邻接表。
5. 注意事项
  • 性能push_back均摊O(1),但扩容可能导致拷贝开销,建议用reserve预分配空间。
  • 越界访问vec[i]不检查越界,可能导致未定义行为,建议用at(i)或检查size()
  • 内存管理clear()不释放内存,需用shrink_to_fit()swap技巧:
    vector<int>().swap(vec);  // 释放内存
    
  • 迭代器失效:插入或删除元素可能导致迭代器失效,需小心。

三、Python列表与C++ vector的对比

特性/操作Python ListC++ std::vector
类型动态数组,内置类型动态数组,STL模板类
元素类型任意类型(动态类型)固定类型(静态类型)
内存分配动态扩容(1.5-2倍)动态扩容(通常2倍)
访问O(1),支持负索引O(1),无负索引
追加append,均摊O(1)push_back,均摊O(1)
插入/删除O(n),头部操作慢O(n),头部操作慢
切片支持,O(k)不支持,需手动实现
排序sort()/sorted(),O(n log n)std::sort,O(n log n)
内存管理自动管理需手动优化(如reserve
竞赛适用性简单易用,适合快速原型性能更高,适合严格时间限制

四、算法竞赛中的建议

  1. 常见问题与优化
    • 输入处理
      • Python:input().split()list(map(int, input().split()))
      • C++:cin配合vector
        int n; cin >> n;
        vector<int> vec(n);
        for (int i = 0; i < n; ++i) cin >> vec[i];
        
    • 性能优化
      • Python:避免频繁的pop(0),用deque替代。
      • C++:用reserve减少扩容,ios::sync_with_stdio(false)加速I/O。
    • 调试
      • Python:用print快速调试。
      • C++:用cout或调试器,注意越界问题。

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

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

相关文章

【连载3】基础智能体的进展与挑战综述

基础智能体的进展与挑战综述 从类脑智能到具备可进化性、协作性和安全性的系统 【翻译团队】刘军(liujunbupt.edu.cn) 钱雨欣玥 冯梓哲 李正博 李冠谕 朱宇晗 张霄天 孙大壮 黄若溪 2. 认知 人类认知是一种复杂的信息处理系统&#xff0c;它通过多个专门的神经回路协调运行…

MacOs java环境配置+maven环境配置踩坑实录

oracl官网下载jdk 1.8的安装包 注意可能需要注册&#xff01;&#xff01;&#xff01; 下载链接&#xff1a;下载地址点击 注意晚上就不要下载了 报错400 &#xff01;&#xff01;&#xff01; 1.点击安装嘛 2.配置环境变量 export JAVA_HOME/Library/Java/Java…

【Git】--- 企业级开发流程

Welcome to 9ilks Code World (๑•́ ₃ •̀๑) 个人主页: 9ilk (๑•́ ₃ •̀๑) 文章专栏&#xff1a; Git 本篇博客我们讲解Git在企业开发中的整体流程&#xff0c;理解Git在实际企业开发中的高效设计。 &#x1f3e0; 企业级开发流程 一个软件从零开始到最…

蓝桥杯嵌入式历年省赛客观题

一.第十五届客观题 第十四届省赛 十三届 十二届

解决2080Ti使用节点ComfyUI-PuLID-Flux-Enhanced中遇到的问题

使用蓝大的工作流《一键同时换头、换脸、发型、发色之双pulid技巧》 刚开始遇到的是不支持bf16的错误 根据《bf16 is only supported on A100 GPUs #33》中提到&#xff0c;修改pulidflux.py中的dtype 为 dtype torch.float16 后&#xff0c;出现新的错误&#xff0c;这个…

LabVIEW驱动开发的解决思路

在科研项目中&#xff0c;常面临将其他语言开发的定制采集设备驱动转换为 LabVIEW 适用形式的难题。特别是当原驱动支持匮乏、开发人员技术支持不足时&#xff0c;如何抉择解决路径成为关键。以下提供具体解决思路&#xff0c;助力高效解决问题。 ​ 一、评估现有驱动死磕的可…

七、Qt框架编写的多线程应用程序

一、大纲 学习内容&#xff1a;使用两个线程&#xff0c;分别点击两个按钮&#xff0c;触发两个不同的效果 所需控件&#xff1a;两个button、三个label 涉及知识点&#xff1a;多线程、Qt的connect机制、定时器、互斥锁 需求&#xff1a; 1&#xff0c;多线程定时计数&#x…

MATLAB求和∑怎么用?

MATLAB求和∑怎么用&#xff1f; 一&#xff1a;题目&#xff1a;求下列方程的和 二、代码如下 1.syms函数 &#xff08;方法一) 代码如下&#xff08;示例&#xff09;&#xff1a; 1. syms x 2. symsum((x.^22*x).^3,1,100) 3. 2.直接用循环 (方法二) 代码如下&am…

项目二 使用miniedit创建拓扑

一、项目需求分析&#xff1a; 1. 在ubuntu的桌面环境中运行Mininet的图形化界面2. Mininet图形化界面中搭建拓扑并设置相关的设备和链路属性3. Floodlight中查看拓扑4. 完成Mininet的测试 二、项目实施步骤 1. 运行Mininet图形化界面 在“~/mininet/examples”目录下有一m…

Docker 镜像 的常用命令介绍

拉取镜像 $ docker pull imageName[:tag][:tag] tag 不写时&#xff0c;拉取的 是 latest 的镜像查看镜像 查看所有本地镜像 docker images or docker images -a查看完整的镜像的数字签名 docker images --digests查看完整的镜像ID docker images --no-trunc只查看所有的…

0x02.Redis 集群的实现原理是什么?

回答重点 Redis 集群&#xff08;Redis cluster&#xff09;是通过多个 Redis 实例组成的&#xff0c;每个主节点实例负责存储部分的数据&#xff0c;并且可以有一个或多个从节点作为备份。 具体是采用哈希槽&#xff08;Hash Slot&#xff09;机制来分配数据&#xff0c;将整…

浏览器多开

使用浏览器的用户功能&#xff0c;创建多个用户即可完成浏览器多开的需求&#xff0c;插件等相对独立 需要命名 然后就可以通过多个用户切换来实现多开了&#xff0c;不同任务选择不同用户

Redis常用数据结构和应用场景

一、前言 Redis提供了多种数据结构&#xff0c;每种结构对应不同的应用场景。本文对部分常用的核心数据结构和典型使用场景作出介绍。 二、String&#xff08;字符串&#xff09; 特点&#xff1a;二进制安全&#xff0c;可存储文本、数字、序列化对象等。场景&#xff1a; 缓…

【转载翻译】使用Open3D和Python进行点云处理

转自个人博客&#xff1a;【转载翻译】使用Open3D和Python进行点云处理 转载自&#xff1a;Point Cloud Processing with Open3D and Python 本文由 Carlos Melo 发布于2024年2月12日 本文很适合初学者对三维处理、点云处理以及Open3D库进行初步了解 另外&#xff0c;本文是基于…

用户登录不上linux服务器

一般出现这种问题&#xff0c;重新用root用户修改lsy用户的密码即可登录&#xff0c;但是当修改了还是登录不了的时候&#xff0c;去修改一个文件用root才能修改&#xff0c; 然后在最后添加上改用户的名字&#xff0c;例如 原本是只有user的&#xff0c;现在我加上了lsy了&a…

matplotlib数据展示

目录 一、绘制直方图 1、简单直方图 2、绘制横向直方图 3、绘制堆叠直方图 4、对比直方图 二、折线图与散点图 三、绘制饼图 四、雷达图 1、简单雷达图 2、多层雷达图 五、总和 在前面的学习中&#xff0c;我们能够使用一些库进行数据的整合&#xff0c;收集&#x…

MySQL 面经

1、什么是 MySQL&#xff1f; MySQL 是一个开源的关系型数据库&#xff0c;现在隶属于 Oracle 公司。是我们国内使用频率最高的一种数据库&#xff0c;我本地安装的是比较新的 8.0 版本。 1.1 怎么删除/创建一张表&#xff1f; 可以使用 DROP TABLE 来删除表&#xff0c;使用…

贪心算法 day08(加油站+单调递增的数字+坏了的计算机)

目录 1.加油站 2.单调递增的数字 3.坏了的计算器 1.加油站 链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; gas[index] - cost[index]&#xff0c;ret 表示的是在i位置开始循环时剩余的油量 a到达的最大路径假设是f那么我们可以得出 a b …

String类基本使用

文章目录 1. String类的理解和创建对象2. 创建String对象的两种方式3. 两种创建String对象的区别4. 测试5. 字符串的特性6. String 类的常见方法 1. String类的理解和创建对象 String 对象用于保存字符串&#xff0c;也就是一组字符序列字符串常量对象是用双引号括起的字符序列…

华为机试—火车进站

题目 火车站一共有 n 辆火车需要入站&#xff0c;每辆火车有一个编号&#xff0c;编号为 1 到 n。 同时&#xff0c;也有火车需要出站&#xff0c;由于火车站进出共享一个轨道&#xff0c;所以后入站的火车需要先出站。换句话说&#xff0c;对于某一辆火车&#xff0c;只有在它…