0

次のコードは、2 つの要素セット {2,3} と空のセット {} の和集合を形成しようとする私の試みです。結果のコンテナー (この場合はリスト) のサイズは 2 になるはずです。

ただし、コードを実行すると、 variable の宣言に対して指定された 2 つの場所のどちらに応じて、共用体のサイズが 0 または 3 であることがわかりますunited。これらの結果はどちらも私が期待したものではなく、明らかに両方とも正しいとは言えません。

ここで何が欠けていますか?

#include <list>
#include <set>
#include <algorithm>  
#include <iostream>

using namespace std;

int main()
{
    //list<int> united; // resulting output is 3

    int d1[] = {2,3};
    set<int> dom1(d1, d1+2);
    set<int> dom2;

    list<int> united; // resulting output is 0

    set_union(dom1.begin(), dom1.end(), dom2.begin(), dom2.end(), united.begin());

    cout << united.size();

    return 0;
}
4

2 に答える 2

3

のドキュメントを見ると、5 番目の反復子がOutputIteratorstd::set_unionの要件を満たす必要があることがわかります。

次に、 のドキュメントを見ると、 (or )std::list::beginが返されることがわかります。これは、 InputIteratorのサブタイプであるBidirectionalIteratorのみです。std::list::iteratorstd::list::const_iterator

技術的には、非 const InputIterator も OutputIterator ですが、それはプログラムでは機能しない方法で動作します。のノードを反復しunited、ソース要素を既存のものにコピー割り当てします。しかし、unitedあなたの場合は空であるため、イテレータが範囲外になり、未定義の動作が発生します。

新しい要素を挿入する OutputIterator を取得する簡単な方法は、std::back_inserter.

于 2016-04-04T14:43:38.557 に答える
2

一般に、「間違った一貫性のない回答」を得るたびに、未定義の動作があるか、診断されていないプログラムの形式が正しくありません。範囲外のバグを探します。

ここで、出力反復子は存在しない範囲を参照しています。

必要に応じて要素が作成されるように、にunited.begin()置き換える必要があります。std::back_inserter(united)

これは、cppreference.com のstd::set_unionドキュメントの例によるものです。
ドキュメントを読んでください!

于 2016-04-04T14:43:38.993 に答える