C char 与使用索引访问的 C++ 字符串元素有何不同

San*_*eev 0 c++ string stl

我正在使用 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:巴拿马

Osy*_*otr 7

看一下签名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]指向错误的内存。修改容器时访问容器元素是不安全的。

  • 解决方案是预先传递 static_cast&lt;char&gt;(str[1]) 或将 str[1] 分配给 char 类型的变量。 (3认同)