Filter/copy 一个向量基于另一个向量中的元素
Filter/copy a vector based on elements in another vector
我有一个由某种类型的元素组成的向量(有一个 name
成员),我想过滤(或复制)这个向量,使其只包含名称与特定列表相匹配的元素名字。所以基本上:"Copy the element if its name is equal to any of the names in 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)
Above code on ideone if you want to play around.
我想这可能是使用范围的一个很好的例子,但是我的代码需要在 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
。
我有一个由某种类型的元素组成的向量(有一个 name
成员),我想过滤(或复制)这个向量,使其只包含名称与特定列表相匹配的元素名字。所以基本上:"Copy the element if its name is equal to any of the names in 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)
Above code on ideone if you want to play around.
我想这可能是使用范围的一个很好的例子,但是我的代码需要在 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
。