string 的 erase
erase的函数定义
- string& erase ( size_t pos = 0, size_t n = npos );
- iterator erase ( iterator position );
- iterator erase ( iterator first, iterator last );
对应的用法:
- 删除字符串pos开始的n个字符
- 删除字符串position(迭代器)处的一个字符
- 删除字符串first(迭代器)到last(迭代器)之间的字符。
删除首尾空格
string trim(string str)
{
//删除0到第一个不是空格的字符
str.erase(0, str.find_first_not_of(" "));
//删除最后一个不是空格的字符到字符串结尾
str.erase(str.find_last_not_of(" ")+1, str.length());
return str;
}
测试
int main()
{
string str = " This is string ";
string str1 = trim(str);
cout<<"|"<<str<<"|"<<endl; // | This is string |
cout<<"|"<<str1<<"|"; // |This is string|
return 0;
}
利用 find + erase 删除全部空格
每次从pos开始搜索,遇到空格就返回给pos,通过erase删除该处的空字符,因为find找不到指定的字符会返回结尾的迭代器,所以当pos等于结尾的迭代器时结束循环。
string trimAll(string str)
{
string::iterator pos = str.begin();
while(1)
{
pos = find(pos, str.end(), ' ');
if(pos == str.end()) break;
str.erase(pos);
}
return str;
}
测试
int main()
{
string str = " This is string ";
string str1 = trimAll(str);
cout<<"|"<<str<<"|"<<endl; // | This is string |
cout<<"|"<<str1<<"|"; // |Thisisstring|
return 0;
}
利用 remove_if + erase 删除
首先了解对于 remove_if(iterator first, iterator last, Predicate _pred) 函数并没有真的移除元素,它只是将符合 _pred 的元素依次替代前面的元素而已。
int main()
{
vector<int> num = {1,2,3,4,5,6,7};
// 移除小于3的元素
remove_if(num.begin(), num.end(), [](int x){return x < 3;});
for(auto n : num)
{
cout<<n<<" ";
}
return 0;
}
结果: 3 4 5 6 7 6 7
因为从3开始不符合 x < 3 的条件,所以将 3 代替 1, 4 代替 2,以此类推。最后返回最后一个不符合条件的迭代器。
因此,可以通过 remove_if 函数筛选出字符不为空格的元素,然后删除返回的迭代器位置到字符结尾位置的字符
string _trimAll(string str)
{
auto itor = remove_if(str.begin(), str.end(), [](char c){return c == ' ';});
str.erase(itor,str.end());
return str;
}
测试
int main()
{
string str = " This is string ";
string str1 = _trimAll(str);
cout<<"|"<<str<<"|"<<endl; // | This is string |
cout<<"|"<<str1<<"|"; // |Thisisstring|
return 0;
}