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

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.dtcms.com/a/296513.html

相关文章:

  • Lua(字符串)
  • 生成式人工智能展望报告-欧盟-03-经济影响
  • pyautogui 置信度问题
  • 拖拽同时支持Y轴滚动
  • 开立医疗2026年校园招聘
  • openbmc 日志系统继续分析
  • 行为型模式-协作与交互机制
  • 华为仓颉编程语言的表达式及其特点
  • mac llama_index agent算术式子计算示例
  • 力扣刷题(第九十七天)
  • 强化学习入门三(SARSA)
  • 专题:2025微短剧行业生态构建与跨界融合研究报告|附100+份报告PDF汇总下载
  • LeetCode 1695.删除子数组的最大得分:滑动窗口(哈希表)
  • 07 RK3568 Debian11 网络优先级
  • “抓了个寂寞”:一次实时信息采集的意外和修复
  • 网络基础19--OSPF路由协议(上)
  • 基于QT(C++)实现(图形界面)通讯录系统
  • JavaJSP
  • 【SpringAI实战】FunctionCalling实现企业级自定义智能客服
  • Qt 调用ocx的详细步骤
  • 单片机学习课程
  • 数据推荐丨海天瑞声7月数据集上新啦!
  • 海外红人营销的下一站:APP出海如何布局虚拟网红与UGC生态?
  • idea监控本地堆栈
  • Redis分布式锁的学习(八)
  • 无源域自适应综合研究【2】
  • Qt连接MySql数据库
  • SAP B1 DTW成功登录后点击下一步提示没有权限读取清单
  • QML 模型
  • 阿里云SLS未开启索引时无法查询日志内容