3

请告诉我是否正确理解 substr 成员函数?
result = result.substr(0, pos) + result.substr(pos + 1);
它从 pos 获取字符串,0 直到(但不包括), remove[i]
然后+ result.substr(pos + 1);连接字符串的其余部分,除了但不包括字符串 / char in 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;
}
4

4 回答 4

7

简而言之,你问的是

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

删除 position 的字符pos,对吗?

简短的回答:

是的。

更长的答案:

两个参数调用采用起始索引长度(一个参数调用转到字符串的末尾)。

它有助于想象这样的字符串:

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擦除(眨眼眨眼)到位:

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(), '/');
于 2012-11-07T14:21:15.403 回答
4

尽管您的问题的答案是“是”,但有更好的方法来解决您正在尝试做的事情。使用string::erase,像这样:

result.erase(pos, 1);

此 API 旨在从字符串中删除字符;它更有效地实现了相同的结果。

于 2012-11-07T14:23:06.753 回答
0

remove是的,此功能会删除 中的所有字母text

于 2012-11-07T14:24:56.763 回答
0

由于您似乎删除了不止一种类型的字符,因此也请使用特殊谓词查看remove_iffrom <algorithm>,尽管 dasblinkenlignt 的响应是好的

于 2012-11-07T14:29:18.237 回答