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