我有一个某种类型的元素(带有一个name
成员)的向量,我想过滤(或复制)此向量,以便它仅包含名称与某些名称列表匹配的元素。基本上就是这样:“如果元素的名称等于”中的任何名称,则复制该元素vector<string> filter
。
我一直在尝试使用std::copy_if
和进行操作std::any_of
,导致产生如下所示的代码,但由于any_of
无法以这种方式应用,所以我一次使其无法正常工作,而且我不确定其中使用的是正确的工具。这个案例。
using namespace std;
template<class T>
struct MyType {
string name;
T data;
};
template<class T>
vector<MyType<T>> filter(vector<MyType<T>> items, vector<string> filter)
{
vector<MyType<T>> filteredItems;
copy_if(begin(items), end(items), begin(filteredItems), any_of(begin(filter), end(filter), [](const MyType<T>& lhs, const MyType<T>& rhs) {return lhs.name == rhs.name; }));
return filteredItems;
};
int main() {
vector<MyType<int>> items { {"a", 1}, {"b", 2}, {"c", 3} };
vector<string> filter { "a", "c" };
auto filteredItems = filter(items, filter);
}
我如何才能做到这一点,最好是具有std::
功能性?(欢迎使用C ++ 11/14)
我想这可能是使用范围的一个很好的例子,但是我的代码需要在VS 2013上编译,所以我不能使用https://github.com/ericniebler/range-v3,我有点犹豫使用较旧的范围库,但我可以说服其他人。
copy_if
是正确的选择,但您的谓词是错误的,因此您需要使用back_inserter
。
copy_if(begin(items), end(items), back_inserter(filteredItems),
[&](const MyType<T> & item) { return std::find(begin(filter), end(filter), item.name) != end(filter);} );
要查找某个范围内的内容,请使用std::find
,它会执行简单的线性搜索。如果filter
排序,std::binary_search
也可以使用。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句