Python及C++中的列表
一、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列表。
- 类型安全:必须指定元素类型(如
int、double等)。 - 连续内存:元素存储在连续内存中,支持随机访问(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循环(C++11):for (auto it = vec.begin(); it != vec.end(); ++it) {cout << *it << " "; }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()实现栈。 - 排序和搜索:结合
sort和binary_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 List | C++ 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) |
| 竞赛适用性 | 简单易用,适合快速原型 | 性能更高,适合严格时间限制 |
四、算法竞赛中的建议
- 常见问题与优化:
- 输入处理:
- 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:
- 性能优化:
- Python:避免频繁的
pop(0),用deque替代。 - C++:用
reserve减少扩容,ios::sync_with_stdio(false)加速I/O。
- Python:避免频繁的
- 调试:
- Python:用
print快速调试。 - C++:用
cout或调试器,注意越界问题。
- Python:用
- 输入处理:
相关文章:
Python及C++中的列表
一、Python中的列表(List) Python的列表是动态数组,内置于语言中,功能强大且易用,非常适合算法竞赛。 1. 基本概念 定义:列表是一个有序、可变的序列,可以存储任意类型的元素(整数…...
Oracle DROP、TRUNCATE 和 DELETE 原理
在 Oracle 11g 中,DROP、TRUNCATE 和 DELETE 是三种不同的数据清理操作,它们的底层原理和适用场景有显著差异 1. DELETE 的原理 类型:DML(数据操作语言) 功能:逐行删除表中符合条件的数据,保留…...
ida 使用记录
文章目录 伪代码-汇编hexstring快捷键 伪代码-汇编 流程图界面——F5——伪代码界面——再点Tab——流程图界面——再按空格——汇编界面流程图界面——空格——汇编界面 hex view - open subviews - hex dump string view - open subviews - string快捷键: sh…...
【连载3】基础智能体的进展与挑战综述
基础智能体的进展与挑战综述 从类脑智能到具备可进化性、协作性和安全性的系统 【翻译团队】刘军(liujunbupt.edu.cn) 钱雨欣玥 冯梓哲 李正博 李冠谕 朱宇晗 张霄天 孙大壮 黄若溪 2. 认知 人类认知是一种复杂的信息处理系统,它通过多个专门的神经回路协调运行…...
MacOs java环境配置+maven环境配置踩坑实录
oracl官网下载jdk 1.8的安装包 注意可能需要注册!!! 下载链接:下载地址点击 注意晚上就不要下载了 报错400 !!! 1.点击安装嘛 2.配置环境变量 export JAVA_HOME/Library/Java/Java…...
【Git】--- 企业级开发流程
Welcome to 9ilks Code World (๑•́ ₃ •̀๑) 个人主页: 9ilk (๑•́ ₃ •̀๑) 文章专栏: Git 本篇博客我们讲解Git在企业开发中的整体流程,理解Git在实际企业开发中的高效设计。 🏠 企业级开发流程 一个软件从零开始到最…...
SAP系统客户可回收包材库存管理
问题:客户可回收包材库存管理 现象:回收瓶无库存管理,在库数量以及在客户的库存数量没有统计,管理混乱。 解决方法: 客户可回收包装材料在SAP有标准的解决方案,在集团尚未启用该业务,首先…...
蓝桥杯嵌入式历年省赛客观题
一.第十五届客观题 第十四届省赛 十三届 十二届...
JDK的卸载与安装
卸载JDK 删除java的1安装目录 卸载JAVA_HOME 删除path下关于java的路径 java -version查看 安装JDK 百度搜索JDK,找到下载地址 同意协议 下载电脑对应版本 双击安装 记住安装路径 配置环境变量 我的电脑–>右键–>属性–>高级系统设置 环境变…...
八股系列(分布式与微服务)持续更新!
八股系列(分布式与微服务) 分布式系统的概念 分布式系统是由多个节点组成,节点之间通过网络协议传递数据,对外表现为一个统一的整体,一个节点可以是一台机器或一个进程;分布式系统的核心功能 资源共享&…...
【源码】Mybatis源码
引言 MyBatis 作为 Java 开发中广泛使用的持久层框架,其高效且灵活的数据库操作能力备受开发者青睐。在日常开发中,我们熟练运用 MyBatis 的各种功能来实现数据持久化,但深入探究其源码,能让我们更透彻地理解它的工作原理&#…...
解决2080Ti使用节点ComfyUI-PuLID-Flux-Enhanced中遇到的问题
使用蓝大的工作流《一键同时换头、换脸、发型、发色之双pulid技巧》 刚开始遇到的是不支持bf16的错误 根据《bf16 is only supported on A100 GPUs #33》中提到,修改pulidflux.py中的dtype 为 dtype torch.float16 后,出现新的错误,这个…...
LabVIEW驱动开发的解决思路
在科研项目中,常面临将其他语言开发的定制采集设备驱动转换为 LabVIEW 适用形式的难题。特别是当原驱动支持匮乏、开发人员技术支持不足时,如何抉择解决路径成为关键。以下提供具体解决思路,助力高效解决问题。 一、评估现有驱动死磕的可…...
[英语] abominable、detestable、despicable、odious、contemptible的区别
关于 abominable 与其他近义词的辨析 abominable 的核心含义是“因极端恶劣或违背道德而令人憎恶”,其情感强度较高,常带有道德批判意味。以下是其与常见近义词的区别及典型用法: 1. abominable vs. detestable abominable:强调…...
七、Qt框架编写的多线程应用程序
一、大纲 学习内容:使用两个线程,分别点击两个按钮,触发两个不同的效果 所需控件:两个button、三个label 涉及知识点:多线程、Qt的connect机制、定时器、互斥锁 需求: 1,多线程定时计数&#x…...
MATLAB求和∑怎么用?
MATLAB求和∑怎么用? 一:题目:求下列方程的和 二、代码如下 1.syms函数 (方法一) 代码如下(示例): 1. syms x 2. symsum((x.^22*x).^3,1,100) 3. 2.直接用循环 (方法二) 代码如下&am…...
项目二 使用miniedit创建拓扑
一、项目需求分析: 1. 在ubuntu的桌面环境中运行Mininet的图形化界面2. Mininet图形化界面中搭建拓扑并设置相关的设备和链路属性3. Floodlight中查看拓扑4. 完成Mininet的测试 二、项目实施步骤 1. 运行Mininet图形化界面 在“~/mininet/examples”目录下有一m…...
Docker 镜像 的常用命令介绍
拉取镜像 $ docker pull imageName[:tag][:tag] tag 不写时,拉取的 是 latest 的镜像查看镜像 查看所有本地镜像 docker images or docker images -a查看完整的镜像的数字签名 docker images --digests查看完整的镜像ID docker images --no-trunc只查看所有的…...
0x02.Redis 集群的实现原理是什么?
回答重点 Redis 集群(Redis cluster)是通过多个 Redis 实例组成的,每个主节点实例负责存储部分的数据,并且可以有一个或多个从节点作为备份。 具体是采用哈希槽(Hash Slot)机制来分配数据,将整…...
浏览器多开
使用浏览器的用户功能,创建多个用户即可完成浏览器多开的需求,插件等相对独立 需要命名 然后就可以通过多个用户切换来实现多开了,不同任务选择不同用户...
Python中NumPy的逻辑和比较
在数据科学和科学计算领域,NumPy是一个不可或缺的Python库。它提供了高效的多维数组对象以及丰富的数组操作函数,其中逻辑和比较操作是NumPy的核心功能之一。通过灵活运用这些操作,我们可以轻松实现数据筛选、条件判断和复杂的数据处理任务。…...
20250412_代码笔记_CVRProblemDef
文章目录 前言一、get_random_problems 函数分析二、augment_xy_data_by_8_fold 函数分析代码 前言 该笔记分析代码的功能是生成随机VRP问题的数据,包含仓库坐标、节点坐标和节点需求。 对该代码进行改进 20250412-代码改进-拟蒙特卡洛 一、get_random_problems 函…...
机器学习(3)——决策树
文章目录 1. 决策树基本原理1.1. 什么是决策树?1.2. 决策树的基本构成:1.3. 核心思想 2. 决策树的构建过程2.1. 特征选择2.1.1. 信息增益(ID3)2.1.2. 基尼不纯度(CART)2.1.3. 均方误差(MSE&…...
Redis常用数据结构和应用场景
一、前言 Redis提供了多种数据结构,每种结构对应不同的应用场景。本文对部分常用的核心数据结构和典型使用场景作出介绍。 二、String(字符串) 特点:二进制安全,可存储文本、数字、序列化对象等。场景: 缓…...
【转载翻译】使用Open3D和Python进行点云处理
转自个人博客:【转载翻译】使用Open3D和Python进行点云处理 转载自:Point Cloud Processing with Open3D and Python 本文由 Carlos Melo 发布于2024年2月12日 本文很适合初学者对三维处理、点云处理以及Open3D库进行初步了解 另外,本文是基于…...
用户登录不上linux服务器
一般出现这种问题,重新用root用户修改lsy用户的密码即可登录,但是当修改了还是登录不了的时候,去修改一个文件用root才能修改, 然后在最后添加上改用户的名字,例如 原本是只有user的,现在我加上了lsy了&a…...
SQL 全文检索原理
全文检索(Full-Text Search)是SQL中用于高效搜索文本数据的技术,与传统的LIKE操作或简单字符串比较相比,它能提供更强大、更灵活的文本搜索能力。 基本概念 全文检索的核心思想是将文本内容分解为可索引的单元(通常是词或词组),然后建立倒排…...
dcsdsds
我将为您在页面顶部添加欢迎内容,同时保持整体风格的一致性。以下是修改后的代码,主要修改了模板部分和对应的样式: vue 复制 <template><div class"main-wrapper"><!-- 新增欢迎部分 --><div class"…...
FISCO BCOS区块链Postman接口测试:高级应用与实战技巧 [特殊字符]
引言:为什么Postman是FISCO BCOS测试的利器? 在区块链开发领域,接口测试是确保系统稳定性和安全性的关键环节。作为国产领先的联盟链平台,FISCO BCOS在金融、政务、供应链等多个领域得到广泛应用。而Postman作为一款功能强大的API测试工具,凭借其直观的图形界面和丰富的测…...
KWDB创作者计划—KWDB场景化创新实践:多模态数据融合与边缘智能的突破性应用
引言:AIoT时代的数据库范式重构 在工业物联网设备数量突破千亿、边缘计算节点覆盖率达75%的2025年,传统数据库面临多模态数据处理效率低下、边缘端算力利用率不足、跨域数据协同困难等核心挑战。KWDB(KaiwuDB Community Edition)通…...
