我正在使用 C++ 擦除删除习惯用法并面临一个奇怪的问题。如果我使用字符串索引访问元素,结果将不符合预期。
string str = "A man, a plan, a canal: Panama";
str.erase(remove(str.begin(), str.end(), str[1]), str.end());
Run Code Online (Sandbox Code Playgroud)
结果:安缦、计划、运河:帕纳
如果我按如下方式使用,结果符合预期。
string str = "A man, a plan, a canal: Panama";
str.erase(remove(str.begin(), str.end(), ' '), str.end());
Run Code Online (Sandbox Code Playgroud)
结果 : Aman,aplan,acanal:巴拿马
看一下签名std::remove:
template< class ForwardIt, class T >
ForwardIt remove( ForwardIt first, ForwardIt last, const T& value );
Run Code Online (Sandbox Code Playgroud)
它value是通过常量引用传递的,因此在删除第一个空格后,您str[1]指向错误的内存。修改容器时访问容器元素是不安全的。