【问题标题】:Why does the last symbol in the string double after 'std::remove'? [duplicate]为什么'std :: remove'之后字符串中的最后一个符号会加倍? [复制]
【发布时间】:2019-12-17 16:53:06
【问题描述】:

我想从字符串中删除一个符号':'。

std::cout << str << " "; //1948: 59 63
std::remove(str.begin(), str.end(), ':');
std::cout << str << " ";//1948 59 633

如果我将范围更改为 [str.negin(), str.begin()+5) 一切正常。

【问题讨论】:

  • 谷歌搜索“擦除删除成语”。
  • 或者,为了更好的点击,“remove-erase idiom”=P

标签: c++ string algorithm


【解决方案1】:

std::remove 不会从范围中删除元素。使用迭代器删除元素是不可能的。但是,它会将您不想删除的所有元素移到开头,然后返回一个指向这些项目末尾的迭代器。

std::remove的正确使用方式是这样的:

str.erase(std::remove(str.begin(), str.end(), ':'), str.end());

它将所有“好的”元素移到前面(std::remove 这样做),然后它会删除剩余的元素(str.erase 这样做)。

【讨论】:

    【解决方案2】:

    您必须删除多余的符号(或多个符号)。

    例如

    str.erase( std::remove(str.begin(), str.end(), ':'), str.enc() );
    

    算法std::remove 将指定的应该被移除的元素移动到所用容器的末尾。更准确地说,它将实际元素移动到容器的开头,以取代被移除元素的位置。

    【讨论】:

    • Есть орфографическая ошибка。 enc
    猜你喜欢
    • 1970-01-01
    • 2021-09-18
    • 1970-01-01
    • 2021-02-06
    • 1970-01-01
    • 2023-01-21
    • 1970-01-01
    • 1970-01-01
    • 2021-06-11
    相关资源
    最近更新 更多