C++ c++;字符串成员函数substr的用法
请告诉我是否正确理解substr成员函数?C++ c++;字符串成员函数substr的用法,c++,string,substring,substr,C++,String,Substring,Substr,请告诉我是否正确理解substr成员函数? result=result.substr(0,pos)+result.substr(pos+1) 它从pos 0到(但不包括)删除[i] 然后+result.substr(pos+1)连接字符串的其余部分,但不包括删除中的字符串/字符 string removeLetters2(string text, string remove) { int pos; string result = text; for (int i = 0
result=result.substr(0,pos)+result.substr(pos+1)代码>
它从pos 0到(但不包括)删除[i]
然后
+result.substr(pos+1)
连接字符串的其余部分,但不包括删除中的字符串/字符
string removeLetters2(string text, string remove)
{
int pos;
string result = text;
for (int i = 0; i < remove.length(); i++)
{
while (true)
{
pos = result.find(remove[i]);
if (pos == string::npos)
{
break;
}
else
{
result = result.substr(0, pos) +
result.substr(pos + 1);
}
}
}
return result;
}
string removeLetters2(字符串文本,字符串删除)
{
int pos;
字符串结果=文本;
对于(int i=0;i
简而言之,你是在问
result = result.substr(0, pos) +
result.substr(pos + 1);
删除位置pos
处的字符,对吗
简短答复:
对
详细回答:
两个参数调用采用start索引和长度(一个参数调用到字符串末尾)
这有助于想象这样的字符串:
F o o / B a r
0 1 2 3 4 5 6 <- indices
result.erase(pos, 1);
作为一名程序员,请始终注意距离/索引和长度之间的差异
更好:如果索引已知:
您的代码创建了两个新的临时字符串,然后将它们连接成第三个临时字符串,然后将其复制到结果
最好让string
就地擦除(wink wink):
result.erase(pos,1);
// or by iterator
string::iterator it = ....;
result.erase(it,it+1);
这给字符串实现者留下了更多的优化自由,他们可以选择将pos后面的所有字符向左移动一个。在一个特殊的场景中,这可以通过一个赋值、一个循环和x86交换指令在循环内实现
更好:如果要删除的字符已知:
或者,但我不确定这是否能提供更好的性能,但它可能会提供更好的代码,算法remove\u if
:
#include <algorithm>
// this would remove all slashes, question marks and dots
....
std::string foobar = "ab/d?...";
std::remove_if (foobar.begin(), foobar.end(), [](char c) {
return c=='/' || c=='?' || '.';
});
虽然你的问题的答案是“是”,但有一个更好的方法来做你想做的事情。像这样使用:
F o o / B a r
0 1 2 3 4 5 6 <- indices
result.erase(pos, 1);
此API用于从字符串中删除字符;它可以更有效地实现相同的结果。是的,此函数可以从文本中删除删除中的所有字母,因为您似乎删除了多种类型的字符。请查看如果从
删除中的所有字母,并使用一个特殊谓词,虽然DasbLinkenLight的响应良好可能重复?: