【问题标题】:How to use a std::remove'd string in c++?如何在 C++ 中使用 std::remove'd 字符串?
【发布时间】:2012-05-27 22:39:57
【问题描述】:

假设如下:

string s("!Hello!'");

我的目的是在s变量中获取,只有“Hello”字符串,IOW我要去掉感叹号。

我尝试了以下方法:

std::remove ( s.begin(), s.end(), '!' );

当我 cout 得到的 s 字符串时:

Helloo!

“!”字符已被删除,但字符串的末尾没有移动。

我读到我需要从 std::remove 的返回值中取回一个迭代器,但我是 C++ 新手,没有成功。

我希望像 char::iterator 这样的东西是有效的,但似乎不是......所以

char::iterator new_end;
new_end = std::remove ( s.begin(), s.end(), '!' );
cout << new_end ;

没有成功。

任何帮助/指针将不胜感激!

【问题讨论】:

    标签: c++ string iterator


    【解决方案1】:

    std::remove迭代器上运行,而不是容器。因此,它无法调整容器的大小。

    你应该使用erase-remove idiom:

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

    这里,remove 实现了删除逻辑并返回一个迭代器,指向序列中新的最后一个元素——换句话说,它对元素重新排序但不接触容器。 erase 最后,通过将容器的结尾设置为 remove 返回的内容来调整容器的大小。

    【讨论】:

    • 我认为您的意思是 std::remove(s.begin(),..) 而不是 std::string(s.begin(),...)
    • 最后仍然缺少一点,string::erase 的第二个迭代器参数
    • @KerrekSB:嘿,是的,如果每个人都在抱怨,我们都会过得更好;)我想你也有编辑权限?
    • 它工作正常,谢谢!为简单起见,引入“擦除删除习语”并作为单线解决方案被接受;)
    • 另一种选择是s.resize(std::remove(s.begin(), s.end(), '!')-s.begin())。因为字符串迭代器是随机访问的所以你有operator - 有效,因为resize 从不移动元素。
    【解决方案2】:

    迭代器表示容器中的位置。它们的设计与 C 中指向数组元素的指针具有相似的语义。“结束”迭代器通常表示容器中最后一个元素之后的位置,它是一个有效的迭代器,但它不能被取消引用(你不能使用'*' 运算符)

    为了从容器中删除元素,您必须先使用 remove 再使用erase。这是一个方便的实用函数,您可以使用它从集合中删除值。

    template<typename Collection, typename Element>
    void remove_elements(Collection& c, const Element& e) {
        c.erase(std::remove(c.begin(), c.end(), e), c.end());
    };
    

    现在你可以写了:

    remove_elements(s, '!');
    

    【讨论】:

    • 看起来您犯了与 KonradRudolph 的第一次编辑相同的错误。您也需要将集合的结束迭代器传递给擦除。
    • @juanchopanza 谢谢,你是对的。固定的。这真的强调了使用小函数是多么棒。只有一个地方可以修复它! :-)
    【解决方案3】:

    虽然其他人已经向您展示了一个解决方案,但建议您查看 Scott Meyer 的“Understanding why remove doesn’t really remove anything”(在页面中间的某个位置 - 整个页面都很有趣,顺便说一句)。

    【讨论】:

      猜你喜欢
      • 2014-03-24
      • 2012-10-12
      • 2014-08-30
      • 1970-01-01
      • 1970-01-01
      • 2010-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多