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

C++中std::string和std::string_view使用详解和示例

std::string

一、std::string 简介

std::string 是 C++ 标准库提供的字符串类,封装了动态管理的字符数组,功能比传统的 C 风格字符串(char*)更强大、安全、易用。

属于头文件:<string>
所在命名空间:std

主要优点:

  • 自动内存管理(不需要手动分配/释放)
  • 提供丰富的字符串操作函数(拼接、查找、替换等)
  • 与流(如 cin / cout)兼容性好
  • 支持下标访问与迭代器

二、基本用法示例

#include <iostream>
#include <string>int main() {std::string s1 = "Hello";std::string s2 = "World";std::string s3 = s1 + " " + s2; // 拼接std::cout << s3 << std::endl; // 输出:Hello Worldstd::cout << "字符串长度:" << s3.length() << std::endl;std::cout << "第二个字符:" << s3[1] << std::endl;return 0;
}

三、常用成员函数汇总(+ 示例)

方法说明示例
.size() / .length()获取字符串长度s.length()
.empty()判断是否为空if (s.empty())
.at(i)安全访问第 i 个字符(带边界检查)s.at(0)
.append(str)追加字符串s.append(" World")
.insert(pos, str)插入子串s.insert(5, ",")
.erase(pos, len)删除部分内容s.erase(5, 1)
.replace(pos, len, str)替换部分内容s.replace(0, 5, "Hi")
.substr(pos, len)截取子串s.substr(0, 5)
.find(str)查找子串位置s.find("llo")
.rfind(str)从后向前查找s.rfind("o")
.compare(str)字符串比较(返回值类似 strcmp)s.compare("abc")
.c_str()转为 C 风格字符串(返回 const char*printf("%s", s.c_str())

四、遍历方式

std::string s = "Hello";// 方式1:下标访问
for (size_t i = 0; i < s.size(); ++i)std::cout << s[i] << ' ';// 方式2:范围 for 循环
for (char c : s)std::cout << c << ' ';// 方式3:迭代器
for (auto it = s.begin(); it != s.end(); ++it)std::cout << *it << ' ';

五、与 C 字符串的互转

std::string cppStr = "hello";
const char* cStr = cppStr.c_str();  // C++ -> Cstd::string newStr(cStr);           // C -> C++

六、注意事项

  • string::at() 带边界检查,安全但略慢;[] 不检查越界。
  • std::getline(cin, s) 配合时注意清除输入缓冲区。
  • 不要对 .c_str() 返回的指针进行修改,它是只读的。

七、实战小示例:字符串反转

#include <iostream>
#include <string>
#include <algorithm>int main() {std::string s = "abcdefg";std::reverse(s.begin(), s.end());std::cout << s << std::endl;  // 输出:gfedcba
}

std::string_view

一、std::string_view:轻量字符串视图(C++17 起)

简介

std::string_view 是一个非拥有型的只读字符串引用,不分配内存、不复制数据,适用于传参和高效处理子串。

关键特性

  • 快速,无拷贝(零开销)
  • 支持与 std::string 类似的操作(如 substr, find
  • 生命周期由原始字符串控制,不能跨作用域使用

示例:

#include <iostream>
#include <string>
#include <string_view>void greet(std::string_view name) {std::cout << "Hello, " << name << std::endl;
}int main() {std::string full = "Alice Wonderland";std::string_view sv = full.substr(0, 5);  // "Alice"greet(sv);
}

用于高性能接口设计,可避免大量 string 拷贝。


二、性能优化技巧(std::string)

1. 减少重复构造

避免 string 频繁复制、构造,尽量使用引用或 std::string_view

void process(const std::string& s);  // 优于传值

2. 预分配容量 .reserve()

避免频繁扩容导致的内存复制:

std::string data;
data.reserve(1024);  // 提前分配空间,避免多次 realloc

3. 避免 += 拼接过多次(会触发多次 reallocation)

可改用:

std::ostringstream oss;
oss << "Name: " << name << ", Age: " << age;
std::string result = oss.str();

三、Unicode / UTF-8 字符处理(中文、Emoji等)

C++ std::string 本身对字符集不做解释,只是按字节存储。

示例:
std::string str = "你好";  // 实际为 6 个字节,不是 2 个字符
std::cout << str.length();  // 输出:6

推荐处理 UTF-8 的库:

特点
utf8cpp轻量、纯头文件库
ICU(Intl Components for Unicode)功能强大,适用于多语言、排序等
C++20 char8_t / std::u8string新的 UTF-8 字符类型(现代C++,但库支持有限)

使用 utf8cpp 示例(读取 UTF-8 字符):

#include <utf8.h>
std::string s = "你好世界";
auto it = s.begin();
while (it != s.end()) {uint32_t cp = utf8::next(it, s.end());std::cout << std::hex << cp << " ";
}

四、常见误区与调试建议

1. c_str() 返回的是 const char*,不能修改其内容

char* p = s.c_str();  // 编译器可能允许,但是 UB(未定义行为)

2. 不要返回局部 string_view

std::string_view get_name() {std::string tmp = "Tom";return tmp;  // ❌ tmp 销毁后 string_view 悬空
}

调试建议

  • 使用 .data() + .size() 查看原始字节内容
  • .substr() 替代手动字符切片(更安全)
  • 使用 std::u32string 处理 Unicode(每字符固定宽度)

总结:适用场景对比

功能需求建议使用
动态字符串、读写操作std::string
只读子串、传参std::string_view
跨平台 Unicode 处理utf8cppICU
UTF-16 / UTF-32 字符std::u16string, std::u32string

http://www.xdnf.cn/news/16195.html

相关文章:

  • Redis数据库入门教程
  • 前端安全问题怎么解决
  • 一篇文章了解HashMap和ConcurrentHashMap的扩容机制
  • Node.js 中的内置模板path
  • 论文阅读:《Many-Objective Evolutionary Algorithms: A Survey. 》多目标优化问题的优化目标评估的相关内容介绍
  • 机器翻译编程
  • 【安卓笔记】解决livedata粘性事件
  • 在 Alpine Linux 中创建虚拟机时 Cgroup 挂在失败的现象
  • Springboot宠物用品商城的设计与实现
  • 详解力扣高频SQL50题之197. 上升的温度【简单】
  • 星慈光编程虫2号小车讲解第二篇--向左向右平移
  • Python编程进阶知识之第五课处理数据(matplotlib)
  • Unity VS Unreal Engine ,“电影像游戏的时代” 新手如何抉择引擎?(结)
  • 100条SQL语句分类精讲:从基础到进阶的实操指南
  • 医疗系统国产化实录:SQL Server国产替代,乙方保命指南
  • 机器学习的基础知识
  • 洛谷 P1996 约瑟夫问题之题解
  • kafka的shell操作
  • 多源信息融合智能投资【“图神经网络+强化学习“的融合架构】【低配显卡正常运行】
  • MapStruct类型转换接口未自动注入到spring容器中
  • 快速将前端得依赖打为tar包(yarn.lock版本)并且推送至nexus私有依赖仓库(笔记)
  • 《C++》面向对象编程--类(下)
  • LLM中的位置嵌入矩阵(Position Embedding Matrix)是什么
  • matrix-breakout-2-morpheus靶机通关教程
  • DBA常用数据库查询语句
  • Python爬虫案例:Scrapy+XPath解析当当网网页结构
  • Lua(模块与包)
  • 【docker | 部署 】Jetson Orin与AMD平台容器化部署概述
  • Java 实现 B/S 架构详解:从基础到实战,彻底掌握浏览器/服务器编程
  • 前端性能新纪元:Rust + WebAssembly 如何在浏览器中实现10倍性能提升(以视频处理为例)