在程序测试里,有时候我们会输入一行数字测试, 比如说: 0 1 2 3 4 5 6 7。在上面的例子里面,我们如果只是想得到单一的数字, 直接循环 cin>> 就可以了, 但是如果我们想要的到一个字符串,并且想把字符串里面没有意义的空格去掉,这时普通的操作就比较麻烦了。
有一种很常见的写法是这样的:
string line;
line.erase(remove(line.begin(), line.end(), ' '), line.end());
下面记录一下我就上面的例子中学到的东西:
- string的erase函数
- remove()函数
string的erase函数
erase()函数有三个原形
- erase(int startPosition, int number)
- erase(iterator position)
- erase(iterator startPosition, iterator endPosition)
erase()三种对应的用法
- 从字符串的startPosition位置开始,删除number个字符串, erase(0, 2)就是删除前两个字符
- 从字符串的position位置删除一个字符,注意这个参数类型是iterator
- 从字符串的startPosition位置删除到endPosition,注意这两个参数的类型都是iterator
下面是一个示例:
#include<iostream>
using namespace std;
int main(){
string s = "This is a simple example.";
string::iterator it;
cout << s << endl; //This is a simple example.
//用第一种方法,从位置9开始,删除7个字符串
s.erase(9, 7);
cout << s << endl; //This is a example.
//用第二种方法,传入一个iterator,删除它指定位置的字符
it = s.begin() + 8;
s.erase(it);
cout << s << endl; //This is exapmle.(is后面有两个空格)
//用第三种方法,第一个参数表示开始删除的位置,第二个参数表示删到哪里, 类型都是iterator
//注意s.end位置是最后的 ".", 把它当成begin()往前数就好了,这个方法是闭区间哦。
s.erase(s.begin() + 4, s.end() - 9);
cout << s << endl;
}
整体的介绍
回到最开始的例子:
line.erase(remove(line.begin(), line.end(), ' '), line.end());
line是一个字符串,调用了这个方法串之后,它就把自己包含的‘ ’(空格)全部删掉了,先看外面, 应该使用的是erase()的第三种方法,去掉了从 remove(line.begin(), line.end(), ’ ‘) 到 line.end() 之间的所有内容。
可见remove方法返回了一个指针。我在Google上查到了这样一个解释:
Briefly, std::remove moves the non-removed items to the front of the vector and returns an iterator pointing just beyond the last unremoved item. Then std::erase trims the vector from that iterator to the end.
相看解释出处请点我。
简单翻译一下就是 std::remove()方法把没有被删掉的元素移到上面,并且返回了最后一个没有被删除元素的迭代器。关于上面这个例子中的remove()方法的作用应该很容易就看出来,就是删除line.begin()到line.end()之前所有的空格。
所以,如果我们输入:
0 1 2 3 4 5 6 7
然后用这个方法,我们就会得到:
01234567