已经提到了remove_if()函数。但是,在C++0x中,你可以使用一个lambda表达式来指定它的断言。
以下是一个示例,其中展示了三种不同的筛选方式。还包括“copy”函数版本,以处理与const相关的情况或者不想修改原始数据的情况。
#include <iostream>
#include <string>
#include <algorithm>
#include <cctype>
using namespace std;
string& remove_chars(string& s, const string& chars) {
s.erase(remove_if(s.begin(), s.end(), [&chars](const char& c) {
return chars.find(c) != string::npos;
}), s.end());
return s;
}
string remove_chars_copy(string s, const string& chars) {
return remove_chars(s, chars);
}
string& remove_nondigit(string& s) {
s.erase(remove_if(s.begin(), s.end(), [](const char& c) {
return !isdigit(c);
}), s.end());
return s;
}
string remove_nondigit_copy(string s) {
return remove_nondigit(s);
}
string& remove_chars_if_not(string& s, const string& allowed) {
s.erase(remove_if(s.begin(), s.end(), [&allowed](const char& c) {
return allowed.find(c) == string::npos;
}), s.end());
return s;
}
string remove_chars_if_not_copy(string s, const string& allowed) {
return remove_chars_if_not(s, allowed);
}
int main() {
const string test1("(555) 555-5555");
string test2(test1);
string test3(test1);
string test4(test1);
cout << remove_chars_copy(test1, "()- ") << endl;
cout << remove_chars(test2, "()- ") << endl;
cout << remove_nondigit_copy(test1) << endl;
cout << remove_nondigit(test3) << endl;
cout << remove_chars_if_not_copy(test1, "0123456789") << endl;
cout << remove_chars_if_not(test4, "0123456789") << endl;
}
std::remove
将未删除的项移动到向量的前面,并返回一个指向最后一个未删除项的迭代器。然后,std::erase
从该迭代器到结尾修剪向量。 - chwarrstring chars("()-");
,然后使用.length()
方法获取长度和.at(i)
方法访问字符 :) 函数化fiddle - http://ideone.com/tAZt5I - jave.web<iostream>
<algorithm>
<cstring>
。 - jave.webstrlen(chars)
,因为它的复杂度是O(n)
。 - fnc12