手撕算法之`vector` 扩容、`string` 分割、链表翻转

手写常见操作:vector 扩容、string 分割、链表翻转

(一)vector扩容

在 C++ 中,vector 的扩容机制是动态数组实现的核心特性,直接关系到性能和内存使用效率。以下是深入剖析:


1. 扩容触发条件

vector<int> v;
v.push_back(1);  // 当 size() == capacity() 时触发扩容
  • 当插入新元素时,若当前元素数量 size() 等于容量 capacity(),则触发扩容

2. 扩容算法核心步骤

// 伪代码逻辑
void push_back(const T& value) {if (size == capacity) { // 需要扩容new_cap = max(2 * capacity, 1); // 典型增长策略new_data = allocate(new_cap);    // 1. 申请新内存copy_or_move(old_data, new_data); // 2. 迁移数据deallocate(old_data);            // 3. 释放旧内存}// 插入新元素...
}

3. 关键特性与复杂度分析

(1) 扩容因子(Growth Factor)
编译器实现扩容策略数学证明最优性
GCC2 倍扩容(常见)分摊 O(1) 时间复杂度
MSVC1.5 倍扩容更好内存利用率
(2) 时间复杂度
  • 单次 push_back:最坏 O(n)(触发扩容时)
  • 均摊时间复杂度:O(1)(通过分摊分析证明)

4. 扩容过程可视化

vector<int> v;
// 初始状态: capacity=0, size=0v.push_back(1); // 第1次扩容 → capacity=1
v.push_back(2); // 第2次扩容 → capacity=2
v.push_back(3); // 第3次扩容 → capacity=4
v.push_back(4); // 无需扩容
v.push_back(5); // 第4次扩容 → capacity=8

5. 性能优化技巧

(1) 预分配内存
vector<int> v;
v.reserve(1000); // 直接分配足够容量,避免多次扩容
(2) 移动语义优化(C++11+)
class BigObject {
public:BigObject(BigObject&& other) noexcept; // 移动构造函数
};vector<BigObject> v;
v.push_back(BigObject()); // 触发移动而非拷贝

6. 不同编译器的扩容策略

通过代码验证不同编译器的扩容行为:

vector<int> v;
size_t last_cap = 0;for (int i = 0; i < 100; ++i) {v.push_back(i);if (v.capacity() != last_cap) {cout << "Size: " << v.size() << ", New Capacity: " << v.capacity() << endl;last_cap = v.capacity();}
}
  • GCC 输出:1 → 2 → 4 → 8 → 16 → 32 → 64 → 128…
  • MSVC 输出:1 → 2 → 3 → 4 → 6 → 9 → 13 → 19…

7. 扩容时的元素迁移

  • 拷贝语义:调用元素的拷贝构造函数(深拷贝)
  • 移动语义(C++11+):优先调用移动构造函数(高效)

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

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

相关文章

鸿蒙NEXT开发问题大全(不断更新中.....)

目录 问题1&#xff1a;鸿蒙NEXT获取华为手机的udid ​问题2&#xff1a;[Fail]ExecuteCommand need connect-key? 问题3&#xff1a;测试时如何安装app包 问题1&#xff1a;鸿蒙NEXT开发获取华为手机的udid hdc -t "设备的序列号" shell bm get --udid 问题2&…

LiteratureReading:[2016] Enriching Word Vectors with Subword Information

文章目录 一、文献简明&#xff08;zero&#xff09;二、快速预览&#xff08;first&#xff09;1、标题分析2、作者介绍3、引用数4、摘要分析&#xff08;1&#xff09;翻译&#xff08;2&#xff09;分析 5、总结分析&#xff08;1&#xff09;翻译&#xff08;2&#xff09;…

ZMC600E,多核异构如何成就机器人精准控制?

ZMC600E主站控制器凭借其多核异构处理器的强大性能&#xff0c;实现了高算力与高实时性的完美平衡&#xff0c;让机器人动作流畅、精准无误。接下来&#xff0c;让我们深入了解其内核结构的奥秘。 在ZMC600E主站控制器控制机器人的时候&#xff0c;可以精准的控制机器人执行各种…

一文掌握 PostgreSQL 的各种指令(PostgreSQL指令备忘)

引言 PostgreSQL 作为一款功能强大、开源的关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;以其高扩展性、SQL 标准兼容性以及丰富的功能特性&#xff0c;成为企业级应用的首选数据库之一。无论是开发、运维还是数据分析&#xff0c;掌握 PostgreSQL 的核心指…

fastadmin后台管理员日志指定方法不记录

做的订单提醒,只要在线会把日志自动存储进去,这个又是每30s执行一次,数据库没多久就爆掉了,最终找到一个处理方法,可能不是最好的,仅供大家参考 具体位置: application/admin/model/AdminLog.php里面的$ignoreRegex方法 protected static $ignoreRegex [/^(.*)\/(selectpage…

Redis Sentinel(哨兵模式)高可用性解决方案

一、概述 Redis Sentinel&#xff08;哨兵模式&#xff09;是Redis的高可用性&#xff08;High Availability, HA&#xff09;解决方案&#xff0c;它通过哨兵系统和Redis实例的协同工作&#xff0c;确保了Redis服务的高可用性和数据的持久性。哨兵系统由一个或多个哨兵进程组…

密码学(Public-Key Cryptography and Discrete Logarithms)

Public-Key Cryptography and Discrete Logarithms Discrete Logarithm 核心概念&#xff1a;离散对数是密码学中一个重要的数学问题&#xff0c;特别是在有限域和循环群中。它基于指数运算在某些群中是单向函数这一特性。也就是说&#xff0c;给定一个群 G G G和一个生成元 …

tcp 通信在wifi 下会出现内容错误吗?

TCP通信在WiFi下可能会出现内容错误。TCP&#xff08;Transmission Control Protocol&#xff0c;传输控制协议&#xff09;是一种面向连接的、可靠的、基于字节流的传输层通信协议。在WiFi环境下&#xff0c;由于信号干扰、信号衰减、多径传播等因素&#xff0c;可能会造成数据…

JVM OOM问题如何排查和解决

在 Java 开发中&#xff0c;JVM OOM&#xff08;OutOfMemoryError&#xff09;问题通常是指程序运行时&#xff0c;JVM 无法为对象分配足够的内存空间&#xff0c;导致发生内存溢出的错误。这个问题往往和内存的配置、内存泄漏、或者资源过度使用等因素有关。 1. OOM 错误类型…

深入解析音频编解码器(Audio CODEC):硬件、接口与驱动开发

音频编解码器&#xff08;Audio CODEC&#xff09;是音频处理系统中的核心组件&#xff0c;负责 模拟信号与数字信号的相互转换&#xff0c;广泛应用于 智能音箱、嵌入式系统、消费电子产品 等设备。本篇文章将从 硬件结构、接口解析、驱动开发 和 软件配置 等方面&#xff0c;…

【QGIS_Python】在QGIS的Python控制台生成SHP格式点数据并显示标注

参考文章&#xff1a; 「GIS教程」使用DeepSeek辅助QGIS快速制图 | 麻辣GIS 示例代码说明&#xff1a;使用参考文章中的省会城市坐标点&#xff0c;左侧增加一列城市序号code, 图层标注显示 code 城市名称&#xff0c;同时在指定路径下生成对应SHP格式点数据。 import os fr…

deepSpeed多机多卡训练服务器之间,和服务器内两个GPU是怎么通信

DeepSpeed 在多机多卡训练时,主要依赖 NCCL 和 PyTorch Distributed 进行通信。具体来说,分为服务器之间和服务器内两种情况: 1. 服务器之间的通信(跨节点通信) DeepSpeed 采用 NCCL(NVIDIA Collective Communications Library)作为主要的通信后端,结合 PyTorch Distr…

k8s-coredns-CrashLoopBackOff 工作不正常

本文作者&#xff1a; slience_me 问题描述 # 问题描述 # rootk8s-node1:/home/slienceme# kubectl get pods --all-namespaces # NAMESPACE NAME READY STATUS RESTARTS AGE # kube-flannel kube-flannel-ds-66bcs …

新能源电站系统建设提速!麒麟信安操作系统驱动光伏风电双领域安全升级

在全球能源结构加速向清洁能源转型的背景下&#xff0c;新能源电站建设正如火如荼地展开&#xff0c;麒麟信安操作系统为光伏与风电领域提供了稳定可靠的底座支持&#xff0c;目前已在中电乾阳光伏、辽宁铁岭风电场、清河光伏、鑫田茨沟风电场、连山风电场等新能源场站落地应用…

Oracle 19c 子分区表索引测试

一、建表语句放在最后&#xff0c;方便查看 二、创建各类索引 --创建本地的主键约束&#xff0c;但必须加上分区键、子分区键MT_O_CODE,M_YMD alter table MS_DMG.A_RED drop constraint MGR_PK_AREAD ; alter table MS_DMG.A_RED add constraint MGR_PK_AREAD primary key …

Linux Vim 寄存器 | 从基础分类到高级应用

注&#xff1a;本文为 “vim 寄存器” 相关文章合辑。 英文引文&#xff0c;机翻未校。 中文引文&#xff0c;略作重排。 未整理去重&#xff0c;如有内容异常&#xff0c;请看原文。 Registers 寄存器 Learning Vim registers is like learning algebra for the first ti…

【Java/数据结构】队列(Quque)

本博客将介绍队列的相关知识&#xff0c;包括基于数组的普通队列&#xff0c;基于链表的普通队列&#xff0c;基于数组的双端队列&#xff0c;基于链表的双端队列&#xff0c;但不包括优先级队列&#xff08;PriorityQueue&#xff09;&#xff0c;此数据结构将单独发一篇博客&…

[数据结构]排序之 归并排序(有详细的递归图解)

一、非递归 基本思想&#xff1a; 归并排序&#xff08; MERGE-SORT &#xff09;是建立在归并操作上的一种有效的排序算法 , 该算法是采用分治法&#xff08; Divide andConquer&#xff09;的一个非常典型的应用。将已有序的子序列合并&#xff0c;得到完全有序的序列&#x…

docker安装向量数据库Milvus及可视化工具 Attu

前置条件 1.安装了docker 2.服务器网络正常&#xff0c;可以连接到容器下载地址 3.服务器磁盘空间正常&#xff0c;docker磁盘占用过大&#xff0c;请参考docker容量占用过大解决办法 一、下载yml文件 可在文章资源下载或者自行下载&#xff1a;下载yml 下载这个单机版本的…

科技云报到:AI Agent打了个响指,商业齿轮加速转动

科技云报到原创。 3月16日&#xff0c;百度旗下文心大模型4.5和文心大模型X1正式发布。目前&#xff0c;两款模型已在文心一言官网上线&#xff0c;免费向用户开放。 同时&#xff0c;文心大模型4.5已上线百度智能云千帆大模型平台&#xff0c;企业用户和开发者登录即可调用AP…