我尝试使用带有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;
答案 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::erase
和iterator first
。这就是为什么我认为它给出了一个奇怪的结果。
你的意思是重载版本:
iterator last
但你没有提供iterator erase (iterator first, iterator last);
。您正在传递将隐式转换为iterator
的{{1}}个文字。在我上面发布的链接中,您可以看到重载的版本+示例。
我预计输出为'ay'
要使用int
获取该输出,请执行以下std::string::begin()
和std::string::end()
:
size_t