web-dev-qa-db-ja.com

c ++ STLセットの違い

C++ STLセットデータ構造には、セット差分演算子がありますか?

63
Steve

はい、あります。<algorithm>にあり、 std::set_difference と呼ばれます。使用法は次のとおりです。

#include <algorithm>
#include <set>
#include <iterator>
// ...
std::set<int> s1, s2;
// Fill in s1 and s2 with values
std::set<int> result;
std::set_difference(s1.begin(), s1.end(), s2.begin(), s2.end(),
    std::inserter(result, result.end()));

最終的に、セットresultにはs1-s2が含まれます。

127
PierreBdR

はい、アルゴリズムヘッダーに set_difference 関数があります。

編集:

参考までに、 documentation に記載されているように、設定されたデータ構造はそのアルゴリズムを効率的に使用できます。このアルゴリズムは、セットだけでなく、ソートされたコレクションのイテレーターのペアでも機能します。

他の人が述べたように、これはメソッドではなく外部アルゴリズムです。おそらくそれはあなたのアプリケーションにとっては問題ないでしょう。

11
Mr Fooz

言語の意味では「演算子」ではありませんが、標準ライブラリにはset_differenceアルゴリズムがあります。

http://www.cplusplus.com/reference/algorithm/set_difference.html

もちろん、リンクされた記事の最後にある「関連項目」セクションで提案されているように、他の基本的な集合演算も存在します(結合など)。

4
philsquared

もう一度、救助を後押しします。

#include <string>
#include <set>
#include <boost/range/algorithm/set_algorithm.hpp>

std::set<std::string> set0, set1, setDifference;
boost::set_difference(set0, set1, std::inserter(setDifference, setDifference.begin());

setDifferenceにはset0-set1が含まれます。

1
strickli

メソッドとしてではなく、外部アルゴリズム関数set_differenceがあります

template <class InputIterator1, class InputIterator2, class OutputIterator>
OutputIterator set_difference(InputIterator1 first1, InputIterator1 last1,
                              InputIterator2 first2, InputIterator2 last2,
                              OutputIterator result);

http://www.sgi.com/tech/stl/set_difference.html

1
Ian G

どうやら、そうです。

SGI-set_difference

1
LeppyR64

C++では、差集合演算子は定義されていませんが、独自に定義できます(他の応答で指定されたコードを使用)。

template<class T>
set<T> operator -(set<T> reference, set<T> items_to_remove)
{
    set<T> result;
    std::set_difference(
        reference.begin(), reference.end(),
        items_to_remove.begin(), items_to_remove.end(),
        std::inserter(result, result.end()));
    return result;
}
0
astraujums