字符串erase()函数为类似的调用提供了不同的结果

时间:2017-08-15 13:02:29

标签: c++

我尝试使用带有2个参数的string::erase()函数作为开始和结束点,但它为同一类型的调用提供了不同的结果。

以下是代码:

#include<iostream>
using namespace std;

int main(){

   string s = "azxxzy";
   s.erase(2,2);
   cout << s;
   s.erase(1,1);
   cout << endl << s;
}

它会删除2个字符,即xx用于第一次通话,但对于第二次通话,它只删除一个z

你能解释为什么会这样吗?

CORRECTED -

问题是错误的,因为我使用了重载版本,即

&#39;串安培; erase(size_t pos = 0,size_t len = npos); &#39;

但预计

的输出

&#39;迭代器擦除(首先是迭代器,最后是迭代器)&#39;

1 个答案:

答案 0 :(得分:3)

您正在使用std::string::erase()以下摘要:

string& erase (size_t pos = 0, size_t len = npos);

它将删除长度为pos的{​​{1}}位置指定的字符串部分。请注意,位置索引len以0开头。pos的默认参数表示直到结尾的所有字符。

在您的示例中,它表示:

len = npos
  

在我的教科书中写道,string s = "azxxzy"; s.erase(2,2); /* azzy: deleting 2 characters from position 2 */ s.erase(1,1); /* azy: deleting 1 character from position 1 */ 的2个参数是std::string::eraseiterator first。这就是为什么我认为它给出了一个奇怪的结果。

你的意思是重载版本:

iterator last

但你没有提供iterator erase (iterator first, iterator last); 。您正在传递将隐式转换为iterator的{​​{1}}个文字。在我上面发布的链接中,您可以看到重载的版本+示例。

  

我预计输出为'ay'

要使用int获取该输出,请执行以下std::string::begin()std::string::end()

size_t