为什么str.erase(0, 0)无法删除字符串的第一个字符?
问题原因:混淆了
string::erase的两个重载版本 你混淆了string::erase的两个不同重载函数,这不是C++语言的问题:
迭代器范围版本
你在官网看到的first, last是迭代器参数的重载:iterator erase(iterator first, iterator last);
它的规则是删除[first, last)区间内的字符,也就是包含first指向的元素,不包含last指向的元素。下标+长度版本
你实际调用的是另一个重载:string& erase(size_t pos = 0, size_t len = npos);
这里的两个参数含义完全不同:- 第一个参数
pos是起始下标 - 第二个参数
len是要删除的字符数量,不是结束下标
- 第一个参数
所以你的几个调用行为完全符合该重载的规则:
str.erase(0, 0):从下标0的位置开始,删除0个字符,自然不会改变字符串str.erase(0, 1):从下标0开始删除1个字符,正好移除首字符str.erase(1, 1):从下标1开始删除1个字符,也就是移除第二个字符
如果想用类似迭代器区间的逻辑(从下标a到下标b之前的字符),用下标版本的话应该写成str.erase(a, b - a),比如要删下标0到1之前的字符(即下标0),就是erase(0, 1-0)也就是erase(0,1),和你之前的正确调用一致。
内容的提问来源于stack exchange,提问作者somebodywhodoesntknowmuch
相关产品推荐
相关产品推荐

