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

时间:2019-06-05 23:23:58

标签: c++ string substring

我正在尝试删除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.

2 个答案:

答案 0 :(得分:2)

您的代码唯一的问题是.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());

答案 1 :(得分:1)

您所拥有的是正确的(对于这种受限情况)并且高效(假设您需要std::string结果;如果您使用的是C ++ 17,std::string_view可能会很好)。如果很丑陋,请使其成为函数,以便其余代码可以使用

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

…尽管对于

而言 无效

remove2(whole, "literal")

分配内存只是为了对在编译时已经知道其编号的字符进行计数。如果那很重要,您可以添加一个需要一定长度并写的重载

remove2(whole, sizeof("literal")-1)