今天我有一个非常简单的,但它确实让我难以忍受了几个小时。我想我的字符串迭代器的字幕有问题。我已经在线查看,甚至将代码传递给了我的CSE教授 - 但是感恩节休息了,他只有他的手机并且无法提供太多帮助。
希望有人能看到这个并立即发现问题。作为一个注释,我的目标只是从字符串中删除特殊字符。该字符串通过引用传递给函数(因此不需要返回类型)。作为补充说明,我试图尽可能保持高效。我最初的想法是简单地将它转移到嵌套for循环,但是我的CSE教授认为在一些特殊情况下,带有字符串迭代器的for循环更有效,所以我应该坚持这一点。如果有人可以提供帮助,请告诉我!
在我看来,问题必须在于remove函数,因为remove需要一个const char *,而不仅仅是一个char *。我假设text.begin()不是const因此导致问题。但是如果我创建函数const string& text的参数,我们显然不能通过引用来修改文本。
这是我到目前为止的代码:
主要有:
string temp = "~cool~";
XML * parser = new XML();
parser->clearSpecialChars(temp);
cout << temp;
,功能是:
void XML::clearSpecialChars(string &text)
{
char chars[]= ".,!()1234567890[]'<>:/{}_|=+;-`~";
for (unsigned int i = 0; i < 33; ++i)
{
text.erase(std::remove(text.begin(),text.end(),chars[i]),text.end());
}
}
但是,我收到编译错误:
XML.cpp: In member function ‘void XML::clearSpecialChars(std::string&)’:
XML.cpp:86:69: error: cannot convert ‘std::basic_string<char>::iterator {aka __gnu_cxx::__normal_iterator<char*, std::basic_string<char> >}’
to ‘const char*’ for argument ‘1’ to ‘int remove(const char*)’
任何想法都将不胜感激!
答案 0 :(得分:3)
有两个名为remove
的函数。以下是对每个人的描述:
答案 1 :(得分:1)
硬编码的“33”让我感到畏缩。你真的希望'\ x00'被包含在你的特殊字符集中吗?
如果可能,Modern C ++会将循环卸载到库例程。这是一个不同的实现。
void XML::clearSpecialChars(string &text)
{
const string chars = ".,!()1234567890[]'<>:/{}_|=+;-`~\x00";
auto new_end = std::remove_if(text.begin(), text.end(),
[chars](string::value_type c)
{ return chars.find(c) != string::npos; });
text.erase(new_end, text.end());
}