C++ 为什么在删除其他字符时,最后一个字符会加倍?如何防止它?

C++ 为什么在删除其他字符时,最后一个字符会加倍?如何防止它?,c++,stl,C++,Stl,我有以下代码: auto rrr="my mixed string"s; rrr.erase(std::remove_if(std::begin(rrr), std::end(rrr), [](char const c) { return c == 'm'; })); std::cout<<rrr<<std::endl; auto rrr=“我的混合字符串”s; rrr.erase(std::remove_if(std::begin(rrr),std::end(rrr)

我有以下代码:

auto rrr="my mixed string"s;
rrr.erase(std::remove_if(std::begin(rrr), std::end(rrr), [](char const c) { return c == 'm'; }));
std::cout<<rrr<<std::endl;
auto rrr=“我的混合字符串”s;
rrr.erase(std::remove_if(std::begin(rrr),std::end(rrr),[](字符常量c){return c=='m';}));

std::cout您使用了错误的
erase()
重载。您正在调用
erase()
重载,该重载接受单个迭代器参数,即要从字符串中删除的单个字符的迭代器

std::remove\u如果
通过简单地将值移动到末尾来“删除”序列中的值,然后返回一个新的“序列结束”迭代器值。调用错误的
erase()
重载只会删除新序列后面的字符。如果未删除任何内容,您可能会将
end()
传递到
erase()
,从而导致未定义的行为和可能的崩溃。但在这种情况下,你很幸运

要完全擦除移动到字符串末尾的“已删除”字符,请将字符串的
end()
迭代器也传递到
erase()

rrr.erase( /* What you already have */, rrr.end());

你的C++书籍或C++参考手册应该有一个完整的清单,列出了所有可用的重载代码:<代码>(或代码>),包括你应该在这里使用的一个,以及对它们所做的解释。

< p>或者使用Boost版本(如果Boost可供你使用),避免所有的膨胀代码。
boost::range::remove_erase_if(rrr, [](char c) { return c == 'm'; });

rrr.erase(std::remove_if(std::begin(rrr),std::end(rrr),[](char const c){return c='m';}),std::end(rrr))
从技术上讲,remove只需将它们移动到末尾,它会将未删除的元素从末尾移到已删除的元素上。留在后面的元素处于“从移动”状态(对于普通类型,这意味着它们是原始元素的副本)。但这只是语义学:)