0

コードは次のとおりです(2セットの結合を見つける):

template <class dtype>
void printSet(dtype data)
{
    std::cout<<"\n";
    for(auto i = data.begin(); i != data.end(); i++)
    {
        std::cout<<*i<<" ,";
    }
}

int main(int argc, char const *argv[])
{
    int arr[] = {1,2,3,4,5};
    std::set<long long> a(arr, arr + 5), b(arr, arr + 5), c;
    std::vector<long long> v;
    b.insert(1000);
    printSet(a);
    printSet(b);
    set_union(a.begin(), a.end(), b.begin(), b.end(), v.begin());
    printSet(v);
    return 0;
}

そして、ここに私が得たものがあります:

1 ,2 ,3 ,4 ,5 ,
[1]    9444 segmentation fault  ./a.out

どこで台無しにしましたか?

4

3 に答える 3

8

vは空なので、書き込みv.begin()はできません。std::back_inserter(v)代わりに使用する必要があります。

于 2012-12-31T15:14:28.837 に答える
6

set_unionそのイテレータでの書き込みを許可する必要があるという意味で、有効な出力イテレータが必要です。vは空なのでv.begin()、有効な反復子ではありません。

ベクターを次のように宣言してみてください

std::vector<long long> v(42);
于 2012-12-31T15:12:25.350 に答える
2

わかりやすくするために、線のstd::cout前でフラッシュすると、それも印刷されていることがわかります。set_unionb

エラーに関しては、これを追加することをお勧めします。

#include <iterator>

set_union行を次のように変更します。

set_union(a.begin(), a.end(), b.begin(), b.end(), back_inserter(v));

back_insert_iteratorによって返されるは、ここback_inserterでの使用に適した出力イテレータです。v.push_backによって割り当てられた各アイテムを呼び出しますset_union


プラットフォームと環境に関する注意:

一般に、コアファイルのサイズ制限がゼロ以外であることを確認し(大規模なプログラムを作成している場合を除いて無制限にする)、デバッガーでコアファイルを調べる方法を学ぶ必要があります。

于 2012-12-31T16:09:28.453 に答える