如何一行实现截取std::string子串并移除原串对应部分?
实现方案
C++标准库的std::string并没有提供直接一步完成「提取子串到新字符串同时从原串移除该子串」的成员方法,但可以组合现有函数在一行代码里搞定需求。
拿你的示例场景来说,可以这么写:
std::string oldStr = "Hello world!"; std::string newStr = [&]() { auto pos = oldStr.find("Hello"); auto res = oldStr.substr(pos, 5); oldStr.erase(pos, 5); return res; }();
执行之后:
newStr的值为"Hello"oldStr的值变为" world!"
拆解逻辑:
oldStr.find("Hello")定位目标子串在原字符串中的起始位置oldStr.substr(pos, 5)截取从该位置开始、长度为5的子串(对应"Hello"的长度),存入临时变量oldStr.erase(pos, 5)从原字符串中移除这段子串- 最后通过lambda表达式返回截取到的子串,赋值给
newStr
补充:处理子串不存在的情况
如果担心目标子串不在原串里触发未定义行为,可以加个判断逻辑:
std::string oldStr = "Hello world!"; std::string newStr = [&]() { auto pos = oldStr.find("Hello"); if (pos == std::string::npos) return std::string(); // 子串不存在时返回空字符串 auto res = oldStr.substr(pos, 5); oldStr.erase(pos, 5); return res; }();
要是不想用lambda,也可以用逗号表达式凑成一行(可读性稍差):
std::string oldStr = "Hello world!"; std::string newStr; newStr = oldStr.substr(oldStr.find("Hello"), 5), oldStr.erase(oldStr.find("Hello"), 5);
内容的提问来源于stack exchange,提问作者javierMarquez
相关产品推荐
相关产品推荐

