gpt4 book ai didi

C++字符串成员函数substr用法

转载 作者:太空狗 更新时间:2023-10-29 19:49:07 26 4
gpt4 key购买 nike

请告诉我我是否正确理解了 substr 成员函数?
result = result.substr(0, pos) + result.substr(pos + 1);
它从 pos, 0 开始获取字符串,直到(但不包括)remove[i]
然后 + result.substr(pos + 1); 连接字符串的其余部分,但不包括 remove?

中的字符串/字符
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;
}

最佳答案

简而言之,你是在问是否

result = result.substr(0, pos) +
result.substr(pos + 1);

删除位置 pos 的字符,对吗?

简答:

是的。

更长的答案:

双参数调用采用开始 indexlength(单参数调用到达字符串末尾)。

将字符串想象成这样会有所帮助:

F o o / B a r
0 1 2 3 4 5 6 <- indices

现在删除/:

F o o / B a r
0 1 2 3 4 5 6 <- indices
1 2 3 | <- 1st length
| 1 2 3 <- 2nd length

result = result.substr(0, 3) <- from index 0 with length 3
+ result.substr(4); <- from index 4 to end

作为一名程序员,请始终注意距离/索引和长度之间的区别。

更好:如果索引已知:

您的代码创建了两个新的临时字符串,然后将它们连接成第三个临时字符串,然后将其复制到 result

不如让string就地删除(wink wink):

result.erase(pos,1);
// or by iterator
string::iterator it = ....;
result.erase(it,it+1);

这为 string 实现者留下了更多的优化自由,他们可以选择将 pos 之后的所有字符向左移动一位。在特殊情况下,这可以通过单个赋值、单个循环并在循环内使用 x86 交换指令来实现。

更好:如果要删除的字符是已知的:

或者,但我不确定这是否会提供更好的性能,但它可能会提供更好的代码,算法remove_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=='?' || '.';
});

remove_if 接受任何函数对象。

如果只有一个字符,那就更简单了:

// this would remove all slashes
std::remove (foobar.begin(), foobar.end(), '/');

关于C++字符串成员函数substr用法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13271572/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com