C++ Lint更喜欢std:string上的erase()方法,而不是clear()方法

C++ Lint更喜欢std:string上的erase()方法,而不是clear()方法,c++,string,std,C++,String,Std,使用Lint它反复反对在std字符串上使用clear,并建议使用不带参数的擦除方法 查看文档时,请执行我希望的操作,也就是将字符串大小调整为零个元素,以便字符串为空且没有任何元素。我不想在此时删除字符串,只想从中删除所有成员 我的问题是这两种方法之间有什么区别?有人知道我应该使用擦除而不是清除方法的原因吗?我看不出一个原因。恰恰相反:我实际上必须查看引用,看看是否可以在没有参数的情况下调用erase()擦除()用于从字符串中删除某些指定字符clear()用于删除字符串的全部内容(但不是其容量)

使用Lint它反复反对在std字符串上使用clear,并建议使用不带参数的擦除方法

查看文档时,请执行我希望的操作,也就是将字符串大小调整为零个元素,以便字符串为空且没有任何元素。我不想在此时删除字符串,只想从中删除所有成员


我的问题是这两种方法之间有什么区别?有人知道我应该使用擦除而不是清除方法的原因吗?

我看不出一个原因。恰恰相反:我实际上必须查看引用,看看是否可以在没有参数的情况下调用
erase()
<代码>擦除()用于从字符串中删除某些指定字符
clear()
用于删除字符串的全部内容(但不是其容量)

一般的编程规则是“写下您的意思”。如果要清除整个字符串,请使用函数:
clear()


此外,在一般情况下,
erase()
还有更多工作要做,它必须检查索引是否在范围内,如果不在范围内,则抛出异常<代码>清除()保证不会抛出。聪明的优化器可能使它们完全相同,但我会考虑使用<代码> Erasee()/<代码>而不是<代码>()(代码)>“早熟”的悲观。

< P>这听起来好像皮特只是对事物太挑剔了。事实上,在C++11中,
clear
被定义为
noexcept
,而
erase
只有一个很强的异常保证
clear
也有更清晰的语义;使用
擦除
,读取代码的人必须检查正在擦除的范围;
clear
没有歧义


在这种情况下,我将忽略/禁用Lint警告。

是。只有在你分析了你的代码并证明它太有效之后,你才应该对它感到悲观。谢谢你的全面回答。我也开了“写下你的意思”的处方,所以它会这样做是令人沮丧的。这主要是一个我们必须使用的遗留系统,因此我们将结合忽略和清理部分代码。感谢它主要在系统的遗留部分,因此我们将进行一些例外。