2016-11-26 45 views
1

從STL容器提取符合特定條件的元素並將其移動到另一個STL容器(例如vector)的最佳方法是什麼?例如:從給定謂詞抽取給定stl容器中的元素到另一個容器

std::vector<int> original {1, 2, 6, 7, 9, 34, 9, 7, 3} 

// For example, I only need event numbers 
auto criteria = [](const int a) -> bool { return a%2 == 0? } 

std::vector<int> newvec = ...; 

所以,我想在手術後是

original = {1, 7, 9, 9, 7, 3} 
newvec = {2, 6, 34} 

一個優雅的解決方案將不勝感激。

+0

所以我們的目標是** **複製的東西** **是否符合一個特定的標準?閱讀關於'std :: copy_if'。 –

回答

4

我會去定製擦除/刪除謂詞,將添加刪除元素newvec

original.erase(std::remove_if(original.begin(), original.end(), [&](int n){ 
    bool match = criteria(n); 
    if(match){ 
     newvec.push_back(n); 
    } 
    return match; 
})); 

demo

你可能要考慮拋vector<T>::reserve混進去,如果你知道滿足您的標準的元素的大致數量。

+1

我想OP不想_copy if_,他想_move if_。 – skypjack

+0

@skypjack是的。似乎我錯過了在回答他們之前應該能夠理解問題的備忘錄。 – krzaq

+0

確實聰明地使用這個成語。恭喜。 – skypjack

1

有沒有這樣的算法,STL,但它是短寫:

template <typename FIterator, typename OIterator, typename Pred> 
FIterator splice_if(FIterator first, FIterator last, OIterator out, Pred p) 
{ 
    FIterator result = first; 
    for (; first != last; ++first) { 
     if (p(*first)) { 
      *result++ = *first; 
     } else { 
     *out++ = *first; 
     } 
    } 
    return result; 
} 
1

對於int類型的對象沒有然而,使用移動迭代器在一般情況下,你可以使用移動迭代重大意義。

這裏是一個示範程序,顯示了一個方法任務

#include <iostream> 
#include <vector> 
#include <algorithm> 
#include <iterator> 

int main() 
{ 
    std::vector<int> original {1, 2, 6, 7, 9, 34, 9, 7, 3}; 

    auto odd_value = [](int x) { return x & 1; }; 

    auto n = std::count_if(original.begin(), original.end(), odd_value); 

    std::vector<int> odd; 
    odd.reserve(n); 
    std::vector<int> even; 
    even.reserve(original.size() - n); 

    std::partition_copy(std::make_move_iterator(original.begin()), 
         std::make_move_iterator(original.end()), 
         std::back_inserter(odd), 
         std::back_inserter(even), 
         odd_value); 

    original = odd; 

    for (int x : original) std::cout << x << ' '; 
    std::cout << std::endl; 

    for (int x : even) std::cout << x << ' '; 
    std::cout << std::endl; 

    return 0; 
} 

它的輸出是

1 7 9 9 7 3 
2 6 34