为啥我不能在 C++ 中使用 str.erase(str.begin() + index) 擦除字符串中的字符?

Posted

技术标签:

【中文标题】为啥我不能在 C++ 中使用 str.erase(str.begin() + index) 擦除字符串中的字符?【英文标题】:Why can't I erase characters in a string using str.erase(str.begin() + index) in C++?为什么我不能在 C++ 中使用 str.erase(str.begin() + index) 擦除字符串中的字符? 【发布时间】:2014-03-11 05:02:40 【问题描述】:

split 功能是擦除字符串中除字母和空格以外的字符。然后将其拆分为单词并将它们存储在向量中。 像这样 输入:apple isnot4me 输出:“apple”“isnotme”

phase.erase(phase.begin() + index); 似乎不起作用。

这是我的 C++ 程序

#include <iostream>
#include <string>
#include <vector>
using namespace std;

const string ALPHABET("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ ");

void split(vector<string> &words, const string &phase)

    int pos = 0, size = 0, index = 0;

    //erace the chracters except for letters and spaces
    while((index = phase.find_first_not_of(ALPHABET, pos)) != string::npos)
    
        phase.erase(phase.begin() + index);
        pos = index;
    

    pos = 0, size = 0, index = 0; //initialize again

    while((index = phase.find_first_of(" ", pos)) != string::npos)
    
        size = index - pos;
        words.push_back(phase.substr(pos, size));
        pos = index + 1;
    

    //add the last word(if exists) to the vector words
    size = phase.length() - pos;
    words.push_back(phase.substr(pos, size));

int main()

    vector<string> words;
    string str;

    cin >> str;

    split(words, str);

    int size = words.size();

    for(int i = 0; i < size; i++)
    
        cout << "\"" << words[i] << "\"" << ' ';
    

    cout << endl;

    return 0;

但是,当我在另一个程序中独立尝试 str.erase(str.begin() + index) 时, 像这样

#include <iostream>
#include <vector>
using namespace std;
int main()

    string str("Hello world!");
    int index = str.find_first_of(" ", 0);
    str.erase(str.begin() + index);

    cout << str << endl;

    return 0;

而且它有效!

【问题讨论】:

所示代码无法编译。 phase 作为 const&amp; 传入。因此,您无法修改它。或者这就是你所说的“不起作用”? 谢谢!!!就是这样!!调试几个小时!! kexanie:你不能真正调试不能编译的东西 糟糕...谢谢纠正。 @kexanie 下次,请确保具体说明“不起作用”的内容。编译错误、链接器错误、输出不符合预期等 【参考方案1】:

您将相位作为 const 字符串传递:

void split(vector<string> &words, const string &phase)

令人惊讶的是你可以编译因为erase不是const...(不应该是)

【讨论】:

以上是关于为啥我不能在 C++ 中使用 str.erase(str.begin() + index) 擦除字符串中的字符?的主要内容,如果未能解决你的问题,请参考以下文章

C++从string中删除所有的某个特定字符

为啥我不能创建在与类定义相同的命名空间中定义的 C++ 类的实例?

为啥我不能在 C++ 中更新我的类属性?

Java 泛型与 C++ 模板有何不同?为啥我不能使用 int 作为参数?

为啥dll不能在c++中使用?

为啥我可以在 Mac OS X 上使用 Cython 编译为 C 但不能编译为 C++