基于另一个向量中的元素过滤/复制向量

时间:2015-02-19 09:49:57

标签: c++ c++11 stl std

我有一些类型的元素向量(带有name成员),我想过滤(或复制)这个向量,使它只包含名称与某些名称列表相匹配的元素。所以基本上:&#34;如果元素的名称等于vector<string> filter&#34;中的任何名称,则复制元素。

我一直在尝试使用std::copy_ifstd::any_of的内容,导致代码如下,但我无法让它工作,因为{{1}无法以这种方式应用,并且我不确定在这种情况下正确的工具是什么。

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); } 功能? (C ++ 11/14欢迎)

Above code on ideone if you want to play around.

我想这可能是使用范围的一个很好的例子,但我的代码需要在VS 2013上编译,因此我无法使用https://github.com/ericniebler/range-v3而且我有点犹豫是否使用较旧的范围图书馆,但我可以说服其他人。

1 个答案:

答案 0 :(得分:2)

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也可以使用。