2017-04-20 8 views
2

、set_union、set_difference、set_intersection、set_symmetric_differenceような操作 "に設定し、" いくつかありますが、私は2つのベクトル間行いたい:C++:複数の要素を削除して「セット」を取り除く方法は? STLアルゴリズムで

vector<int> A={1,2,3,4}; 
vector<int> B={1,3}; 

私はABを取得したいので、AB = {2、 4}。

この「マイナス」を実行する便利な方法はありますか? ありがとう!

+2

['std :: set_difference'](http://en.cppreference.com/w/cpp/algorithm/set_difference)のようなサウンドは、いいえ?あなたはすでにそれに言及しています、なぜあなたはそれを使うことができると思いませんか?それはあなたの 'ベクトル'がソートされていることだけを必要とします。 – BoBTFish

+2

ああ、私はそれを得ると思います:あなたは 'set_'アルゴリズムだけを' std :: set'で使うことができると思いますか?違います。標準ライブラリーのコンテナーとアルゴリズムは、*イテレーター*を介して直接的にはやり取りしないので、アルゴリズムは操作しているコンテナの正確なタイプを気にする必要はありません。結果を 'vector'にも入れたい場合は、アルゴリズムの出力イテレータを作成するために[' back_inserter'](http://en.cppreference.com/w/cpp/iterator/back_inserter)を使います。 – BoBTFish

答えて

4

vectorがソートされている限り、vectorでは絶対にアルゴリズムを使用できます。

#include <algorithm> 
#include <iostream> 
#include <iterator> 
#include <vector> 
int main() { 
    std::vector<int> v1 {1, 2, 3, 4}; 
    std::vector<int> v2 {1, 3}; 
    std::vector<int> out; 
    std::set_difference(std::begin(v1), std::end(v1), // the first vector... 
         std::begin(v2), std::end(v2), // ...minus the second... 
         std::back_inserter(out));  // ...is stored into here 
    for(auto i : out) std::cout << i << ' '; 
} 

プリント:あなたはその後、別のvectorに出力をプッシュするback_inserter()を使用することができます

2 4 

(このバージョンは、それが<を使用して要素を比較することができていることを前提とし、要素が関連してソートされていることに注意してくださいそれはあなたのケースでは明らかです)。

+1

しかし、setアルゴリズムを 'std :: unordered_set'で使用することはできません。これは時々人を混乱させるようです。 – rici

関連する問題