Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ c++;字符串成员函数substr的用法_C++_String_Substring_Substr - Fatal编程技术网

C++ c++;字符串成员函数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

请告诉我是否正确理解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; 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的响应良好

可能重复?: