【问题标题】:Remove special characters from a string using iterators使用迭代器从字符串中删除特殊字符
【发布时间】:2012-11-24 02:50:34
【问题描述】:

我今天为你准备了一个非常简单的方法,但它确实让我难过了好几个小时。我想我的字符串迭代器的字幕有问题。我在网上查看过,甚至将代码传递给了我的 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*)’

任何想法将不胜感激!

【问题讨论】:

  • 您是否包含了algorithm 标头?还有另一个函数称为remove,它接受const char* 作为参数。

标签: c++ string iterator special-characters erase


【解决方案1】:

【讨论】:

  • 就可以了——我只包含了stl。当您意识到自己错过了如此愚蠢的事情时,真是太可怕了。非常感谢您的关注!
【解决方案2】:

硬编码的“33”让我畏缩。您真的希望 '\x00' 包含在您的特殊字符集中吗?

如果可能,现代 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());
}

【讨论】:

  • 好吧,我们之前在那里有一个 strlen 并决定因为特殊字符不会改变我们可以通过不包括 &lt;cstdio&gt; 和硬编码 33 来节省空间。随着时间的推移,迭代器似乎变得越来越流行,您能推荐任何可以帮助我加快速度的好读物吗?
  • Matthew Austern 的“通用编程和 STL”是我所知道的最好的来源。
猜你喜欢
  • 2011-04-11
  • 2016-01-23
  • 2017-03-16
  • 2019-11-09
  • 2011-08-29
相关资源
最近更新 更多