当前位置: 首页 > news >正文

STL中vector和string容器

一:vector

1.1 vector 是什么?

vector可变长度的动态数组,底层采用连续内存空间存储数据,支持随机访问,会自动管理内存,完美解决了原生数组长度固定、内存泄漏的痛点。

1.2 常用 API 实战

1.2.1. 初始化方式

#include <vector> using namespace std; // 1. 空vector vector<int> v1; // 2. 指定大小,初始值为0 vector<int> v2(5); // 3. 指定大小+初始值 vector<int> v3(5, 10); // 5个10 // 4. 列表初始化(C++11及以上) vector<int> v4 = {1,2,3,4,5};

1.2.2. 访问元素

vector<int> v = {1,2,3}; // 1. 下标访问(速度快,越界不报错) cout << v[0] << endl; // 2. at()访问(越界抛异常,更安全) cout << v.at(1) << endl; // 3. 访问首尾元素 cout << v.front() << " " << v.back() << endl;

1.2.3. 增删改查

vector<int> v; // 尾部添加元素(最高效) v.push_back(1); v.emplace_back(2); // C++11,原地构造,比push_back更高效 // 中间插入(效率低,需移动元素) v.insert(v.begin() + 1, 3); // 在下标1处插入3 // 删除元素 v.pop_back(); // 尾部删除 v.erase(v.begin()); // 删除第一个元素 v.clear(); // 清空所有元素(size=0,capacity不变) // 容量操作(性能优化关键) v.reserve(100); // 预留100个元素空间,仅改变capacity,不改变size v.resize(10); // 调整有效元素个数,改变size

1.2.4. 遍历方式

vector<int> v = {1,2,3,4}; // 方式1:下标遍历(最常用) for(int i=0; i<v.size(); i++){ cout << v[i] << " "; } // 方式2:范围for(C++11,最简洁) for(int num : v){ cout << num << " "; }

2.1什么是 vector 二维数组?

vector<vector<int>> v;

2.2二位数组的遍历方式

2.2.1. 空二维 vector(先定义再赋值)

vector<vector<int>> v;

2.2.2. 指定行数 + 空行

// 3行,每行都是空vector vector<vector<int>> v(3);

2.2.3. 指定行数 + 列数

// 3行4列,所有元素 = 10 vector<vector<int>> v(3, vector<int>(4, 10));

2.2.4. 指定行列 + 统一初始值

// 3行4列,所有元素 = 10 vector<vector<int>> v(3, vector<int>(4, 10));

2.2.5. 统一初始化 N 行 M 列

int n = 3, m = 4; vector<vector<int>> v(n, vector<int>(m, 0));

2.3遍历方式

for(int i=0; i<v.size(); i++){ for(int j=0; j<v[i].size(); j++){ cout << v[i][j] << " "; } cout << endl; }

二:string

3.1 string 是什么?

string专门处理字符序列的容器,本质是存放 char 类型的 vector,但封装了大量字符串专属 API,比 char * 数组更安全、更易用。

3.2 常用 API 实战

3.2.1. 初始化方式

// 1. 空字符串 string s1; // 2. C风格字符串初始化 string s2("hello"); // 3. 重复字符初始化 string s3(5, 'a'); // "aaaaa" // 4. 列表初始化 string s4 = {"world"}; // 5. 拷贝初始化 string s5(s2);

3.2.2. 字符串访问与转换

string s = "hello stl"; // 1. 随机访问 cout << s[0] << " " << s.at(1) << endl; // 2. 获取长度/判空 cout << s.size() << " " << s.length() << endl; // 二者等价 cout << s.empty() << endl;

3.2.3. 字符串操作(核心)

string s = "hello"; // 1. 拼接(+=效率远高于+) s += " world"; // 推荐 s.append("!"); // 追加字符串 s.push_back('a'); // 追加单个字符 // 2. 截取子串 string sub = s.substr(0, 5); // 从下标0开始,截取5个字符 // 3. 查找(返回下标,找不到返回string::npos) int pos = s.find("world"); // 正向查找 int rpos = s.rfind("o"); // 反向查找 // 4. 替换 s.replace(0, 5, "hi"); // 把下标0-5的字符替换为"hi" // 5. 清空 s.clear();

3.2.4. 数值转换(C++11)

// 数字转字符串 string s1 = to_string(123); string s2 = to_string(3.14); // 字符串转数字 int num = stoi("123"); double dou = stod("3.14"); long long ll = stoll("123456");

3.2.5. 遍历方式

string s = "hello"; // 范围for(最简洁) for(char c : s){ cout << c << " "; }
http://www.jsqmd.com/news/731713/

相关文章:

  • 行业洞察:输送设备技术演进与市场格局5问
  • 如何快速配置智能象棋助手:3步实现深度学习AI棋局分析
  • 智能仓储物流系统哪家好?2026汽车线束自动化生产线厂家推荐全覆盖 - 栗子测评
  • 2026届学术党必备的五大AI学术网站推荐榜单
  • 解决老旧Mac系统兼容性难题:OpenCore Legacy Patcher技术深度解析与实践指南
  • 《眼中有星光的人》MV“五一”暖心上线:陈思思用歌声致敬每一位平凡追梦人
  • OpenClaw 2026 本地部署指南:从环境准备到一键安装(Windows)
  • 从‘It is a nice day’到[1, 739, 338...]:图解HuggingFace Tokenizer在Vicuna-7B模型中的完整工作流
  • 避开蓝桥杯嵌入式环境那些坑:从CubeMX配置到Keil工程移植的保姆级避雷指南
  • CompressO:完全免费的跨平台视频图像压缩神器,释放你的存储空间
  • 嵌入式Linux下SPI转4串口芯片WK2124驱动移植避坑指南(基于Firefly-RK3399实测)
  • 用逻辑分析仪和8051单片机,我手搓了一个能抗干扰的RF-315/433MHz通用解码库
  • 原生高防与云盾防护怎么选?中小企业低成本安全落地全攻略
  • 内容创作团队借助Taotoken多模型能力辅助选题与文案生成
  • 从“请鞭笞我吧,公瑾!”到“龙年七夕”:三国杀移动版吴国武将台词背后的文化彩蛋与版本变迁
  • 你的ECU重启安全吗?深入UDS 11服务的NRC(否定响应码)排查指南与避坑清单
  • 告别短信轰炸?聊聊5G时代的小区广播(CBS)与公共预警(PWS):技术演进、应用场景与未来展望
  • 告别窗口尺寸限制!WindowResizer:免费的Windows窗口调整工具终极指南
  • 抖音视频下载终极指南:免费开源工具快速批量下载完整教程
  • PCL2启动器资源下载问题终极解决指南:3步告别文件损坏烦恼
  • League Akari:英雄联盟终极自动化工具,彻底改变你的游戏体验
  • 打破硬件壁垒:Sunshine游戏串流服务器全攻略,让老旧设备焕发新生
  • 不用 iCloud 备份 iPhone 短信教程
  • 通过curl命令快速测试Taotoken的ChatGPT接口连通性与响应
  • 视频字幕提取终极指南:3步从视频中提取硬字幕的本地解决方案
  • n8n-claw技能库:零代码扩展AI助手能力的MCP协议实践
  • Go语言net/http与Web开发:构建高性能HTTP服务
  • 3分钟解锁XGP存档自由:这款神器让你告别游戏进度丢失烦恼
  • Cursor Pro破解工具终极指南:5步实现AI编程助手永久免费使用
  • KMS智能激活:如何一键永久激活Windows和Office