簡體   English   中英

根據另一個向量中的元素過濾/復制一個向量

[英]Filter/copy a vector based on elements in another vector

我有一個某種類型的元素的向量(帶有name成員),並且我想過濾(或復制)此向量,以便它僅包含名稱與某些名稱列表匹配的元素。 基本上就是這樣:“如果元素的名稱等於vector<string> filter任何名稱,則復制該元素”。

我一直在嘗試使用std::copy_ifstd::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)

如果您想在ideone上面的代碼。

我想這可能是使用范圍的一個很好的例子,但是我的代碼需要在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也可以使用std::binary_search

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM