从std :: string的两端删除子串?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (144)

我正在尝试删除std :: string中的一些开始和结束分隔符。是否有内置或更好的方法来做到这一点?

这是我目前的方式:

std::string sub = "~test.txt~";
std::string str = "~test.txt~The quick brown fox jumps over the lazy dog.~test.txt~";

str = str.substr(sub.length(), str.length() - sub.length() * 2);

开始和结束分隔符完全相同,它们位于最边缘。

期望值是The quick brown fox jumps over the lazy dog.

提问于
用户回答回答于

你所拥有的是正确的(对于这种受约束的情况)和有效的(假设你需要一个std::string结果; std::string_view如果你使用C ++ 17可能会很好)。如果它很难看,请将其作为一个函数,以便其余代码可以使用

std::string mid=remove2(whole, delim);

......虽然在这种情况下效率

remove2(whole, "literal")

它分配内存只是为了计算编号时已知数字的字符。如果这很重要,你可以添加一个长度和写入的重载

remove2(whole, sizeof("literal")-1)
用户回答回答于

您的代码唯一的问题是.substr()创建一个新的std::string,导致昂贵的分配(除非结果足够小,SSO才能工作)。

使用std::string_view来解决这个问题:

str = std::string_view(str).substr(sub.length(), str.length() - sub.length() * 2);

或者,使用.assign()

str.assign(str.begin() + sub.length(), str.end() - sub.length());

扫码关注云+社区

领取腾讯云代金券