私は2つのセットを持っていて、どれくらい多くの要素があるかを知りたいのですが、に少なくともがあります。ユニオンを別のセットに書き込むのはset_union
の<algorithm>
ですが、数字だけを欲しいです。要素を保存せずにstlを使って見つけることはできますか?stlを使用した2つのセットの和集合の要素数
1
A
答えて
3
私はMarshall Clowに同意します。私はこれを行うための既製のアルゴリズムがあるとは思わない。ここに私が夢見てきたアイデアがあります。これは、単純にカウンタをインクリメントするpush_backメソッドを提供する単純なクラスです。出力イテレータとしてstd :: back_inserterを使用します。
#include <initializer_list>
#include <iterator>
#include <iostream>
#include <algorithm>
template <typename T>
class CountingPushBack
{
public:
using value_type = T;
void push_back(T const &) {++count;}
std::size_t get_count() const {return count;}
private:
std::size_t count = 0;
};
int main()
{
std::initializer_list<int> il1 = { 0, 1, 2, 3, 4 };
std::initializer_list<int> il2 = { 0, 2, 4, 6, 8 };
CountingPushBack<int> cp;
std::set_union(il1.begin(), il1.end(),
il2.begin(), il2.end(),
std::back_inserter(cp));
std::cout << cp.get_count() << std::endl;
}
1
私はそのようなアルゴリズムについて知らない。それは言われている、あなたはset_union
の勇気を使ってそれを行うことができます。このような:
#include <iostream>
#include <set>
// Counts the number of elements that would be in the union
template <class Compare, class InputIterator1, class InputIterator2>
size_t set_union_size(InputIterator1 first1, InputIterator1 last1,
InputIterator2 first2, InputIterator2 last2,
Compare comp)
{
size_t __result = 0;
for (; first1 != last1;)
{
if (first2 == last2)
return __result + std::distance(first1, last1);
if (comp(*first2, *first1))
{
++__result;
++first2;
}
else
{
++__result;
if (!comp(*first1, *first2))
++first2;
++first1;
}
}
return __result + std::distance(first2, last2);
}
int main() {
std::set<int> s1 = { 0, 1, 2, 3, 4 };
std::set<int> s2 = { 0, 2, 4, 6, 8 };
std::cout
<< set_union_size(s1.begin(), s1.end(), s2.begin(), s2.end(), std::less<int>())
<< std::endl;
}
そして、これはあなたが期待するものである、7
を出力します。
1
SCFrenchによって溶液が細かいですが、我々は唯一のback_insert_iterator
を必要とする一方で、それは、コンテナが必要です。次に、実装の例を示します。
#include <iostream>
#include <iterator>
#include <vector>
#include <algorithm>
template <typename T>
class count_back_inserter {
size_t &count;
public:
typedef void value_type;
typedef void difference_type;
typedef void pointer;
typedef void reference;
typedef std::output_iterator_tag iterator_category;
count_back_inserter(size_t &count) : count(count) {};
void operator=(const T &){ ++count; }
count_back_inserter &operator *(){ return *this; }
count_back_inserter &operator++(){ return *this; }
};
あなたは「基本的なコンテナ」に「追加」されるすべての要素のためにインクリメントされるコンストラクタにsize_t
変数を渡すことによって、それを使用することができます。
int main(){
std::vector<int> v1 = {1, 2, 3, 4, 5};
std::vector<int> v2 = { 3, 4, 5, 6, 7};
size_t count = 0;
set_union(v1.begin(), v1.end(),
v2.begin(), v2.end(),
count_back_inserter<int>(count));
std::cout << "The number of elements in the union is " << count << std::endl;
}
関連する問題
- 1. 大集合の2つの集合 - その和の一部
- 2. 2つの関数を使用した数値の和
- 3. 2種類の和集合を使用する方法
- 4. 2つの辞書の和集合を作成する
- 5. C++で2つの配列の和集合を改善する
- 6. RGeo 2つのMultyPolygonsの和集合がnilを返す
- 7. プロローグ内で2つのリストの和集合を作る
- 8. 重複のない2つのテーブルの和集合
- 9. 2つの列の和集合によるグループ
- 10. 配列と2つのファイルの和集合
- 11. は、2つのリストに含まれる要素の和集合から設定されます。
- 12. 和の要素
- 13. 集合の和集合を作るための反復
- 14. 2つのループを持つRubyの2つの合計の和
- 15. flexboxを使用した2つの要素のインライン化
- 16. tclで2つのリストの和集合を見つける方法は?
- 17. Java 8ストリームが交差し、カスタムオブジェクトの2つの異なるリストの和集合
- 18. Sql結合と和集合を使用して
- 19. 2つの要素の融合のためのグラフ理論の使用
- 20. 2列でグループ化し、レベルの和集合をR
- 21. STLマルチセットで2つの等しい要素の順序を変更する
- 22. 要素の2つの値がセルをマージした場合、XSLT?
- 23. 総数を取得するための和集合問題
- 24. セットの要素の組み合わせ
- 25. 特定のタイプの要素のANYコンテナでSTLイテレータを使用する関数
- 26. 2つの要素セットの間のSQLiteクエリ
- 27. Rでマージを使用して2つの集約を結合
- 28. グループとの和の要素
- 29. 変数と等しいループ配列セット要素の場合
- 30. PHPの配列を2つの等価集合に分割し、値の和が等しい場合
私は組合を計算しない理由は何か分かりません(高すぎるかもしれません)。おそらく、アイデンティティサイズ(A∪B)+サイズ(A∩B)=サイズA +サイズBを使用することができます。交差点のサイズを計算できる場合はおそらくです。 – Ismael