news 2026/5/8 18:22:41

C++ STL:map+ vector/string

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C++ STL:map+ vector/string

一、map 核心知识

1. map 底层原理

map 是有序键值对容器,底层基于红黑树(平衡二叉搜索树)实现,默认按照键 key 升序排序,所有操作(查找、插入、删除)的时间复杂度均为O(logn),效率稳定。

2. map 基础定义

// 字符串映射整数(统计字符串频次) map<string, int> cnt; // 整数映射字符串<int, string> id_name; // 嵌套map(复杂键值<int,<int, int>> mp_nest;

3. map 核心操作

(1)插入元素

map 插入有 3 种常用方式,适用不同场景:

<int, string> mp; // 方式1:[]赋值(最简单,若key存在则覆盖value) mp[1] = "张三"; mp[2] = "李四"; // 方式2:insert插入pair(key存在则不插入,不覆盖) mp.insert({3, "王五"}); mp.insert(make_pair(4, "赵六")); // 方式3:emplace(C++11,直接构造元素,效率更高) mp.emplace(5, "孙七");
(2)查找元素
  • find(key):返回迭代器,找到指向该元素,未找到返回mp.end()
  • count(key):返回 key 出现次数(map 中只有 0/1),常用于判断 key 是否存在
// 查找key=2 auto it = mp.find(2); if (it != mp.end()) { // 输出value cout << it->second << endl; } // 判断key是否存在 if (mp.count(3))< "< endl; }
(3)删除元素
  • erase(key):按 key 删除,返回删除个数
  • erase(iterator):按迭代器删除,效率更高
  • clear():清空整个 map
// 按key删除 mp.erase(2); // 按迭代器删除 auto it = mp.find(3); if (it != mp.end()) mp.erase(it); // 清空 mp.clear();
(4)遍历 map

map 支持迭代器遍历、范围 for 遍历,遍历结果默认按 key 升序

// 迭代器遍历 <int, string>::iterator it = mp.begin(); it != mp.end(); it++) { cout< " " << it->second << endl; } // 范围for for (auto &p : mp) { // 引用传递,避免拷贝 < "< endl; }

二、vector 知识点(补充)

1. vector 扩容机制

vector 是动态数组,底层连续内存存储,当容量不足时,会自动扩容(通常 1.5 倍 / 2 倍),扩容过程会重新分配内存、拷贝元素,效率较低。

// 正确删除元素 for (auto it = v.begin(); it != v.end();) { if (*it == 0) it = v.erase(it); else it++; }
  • 二维 vector 优化:提前初始化行列,避免动态扩容
// 5行10列,初始值<int>> v(5, vector<int>(10, 0));
  • reserve(n)只开内存,不创建元素,size 不变
  • resize(n)改变元素个数,多补少删
vector<int> v; v.reserve(100000); // 提前开好,避免多次扩容

快速去重模板

sort(v.begin(),v.end()); v.erase(unique(v.begin(),v.end()),v.end());

三、string 进阶知识点(补充)

1. string 高效操作

  • substr(pos, len):截取子串,第一个参数是起始下标,第二个是长度(易错点)
string s = "abcdef"; // 从下标1开始,截取3个字符:bcd string sub = s.substr(1, 3);
  • append vs +=append可拼接多个字符 / 字符串,效率更高
  • find/rfind:查找子串,返回首次 / 末次出现下标,未找到返回string::npos

2. string 与数字互转(进阶)

// 字符串转数字 string s1 = "12345"; int a = stoi(s1); long long b = stoll(s1); // 数字转字符串 int c = 67890; string s2 = to_string(c);

3.string 可以直接比较字典序

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/8 18:14:29

blog4

申请书处理流程与“草稿—归档”双通道 1. 为什么要把主流程拆成两条通道 申请书相关需求并不只是一件事&#xff1a;既要支持频繁编辑&#xff08;可随时改、可随时预览&#xff09;&#xff0c;又要支持归档与后端处理&#xff08;上传后进入抽取/预览/评分链路&#xff09;。…

作者头像 李华
网站建设 2026/5/8 18:14:21

扩散模型流映射优化:解决轨迹倾斜提升生成质量

1. 扩散模型优化背景与核心挑战扩散模型作为当前生成式AI的重要技术路线&#xff0c;其核心思想是通过逐步去噪的过程实现数据生成。在实际应用中&#xff0c;我们常常面临推理速度与生成质量的平衡问题——传统采样方法需要数百甚至上千步迭代才能获得理想结果&#xff0c;这对…

作者头像 李华
网站建设 2026/5/8 18:09:18

Transformer Lab:AI研究的操作系统,统一模型实验与集群管理

1. 项目概述&#xff1a;Transformer Lab&#xff0c;AI研究者的“操作系统”如果你和我一样&#xff0c;在AI研究或模型开发的路上摸爬滚打过几年&#xff0c;肯定对那种“工具碎片化”的痛深有体会。想跑个模型&#xff0c;得在Hugging Face、Ollama、vLLM之间来回切换&#…

作者头像 李华
网站建设 2026/5/8 18:02:50

VSCode效率革命:Command Dock插件可视化命令面板实战指南

1. 项目概述&#xff1a;为什么我们需要一个命令按钮面板 在VSCode或Cursor这类现代代码编辑器的日常使用中&#xff0c;我们常常会陷入一种重复性的操作循环&#xff1a;打开终端、输入命令、等待执行、再切换回编辑器。无论是启动开发服务器、运行构建脚本、执行Git操作&…

作者头像 李华
网站建设 2026/5/8 17:59:31

从开发者视角浅谈Taotoken官方价折扣对个人项目的影响

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 从开发者视角浅谈Taotoken官方价折扣对个人项目的影响 对于个人开发者或小型独立工作室而言&#xff0c;在有限的预算内维持项目的…

作者头像 李华
网站建设 2026/5/8 17:51:52

长期使用Taotoken聚合API对项目维护复杂度的降低体会

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 长期使用Taotoken聚合API对项目维护复杂度的降低体会 在长期的技术项目演进中&#xff0c;维护成本往往与系统集成的复杂度成正比。…

作者头像 李华