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

vv.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_union行之前冲洗,您应该看到它也b被打印出来。

至于错误,我建议添加以下内容:

#include <iterator>

并将您的set_union线路更改为:

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

back_insert_iterator返回的 by是back_inserter一个适合在这里使用的输出迭代器:它将调用v.push_back分配给它的每个项目set_union


关于您的平台和环境的说明:

一般来说,您应该确保您的核心文件大小限制不为零(除非您正在编写大量程序,否则请使其不受限制),并学习使用调试器检查核心文件。

于 2012-12-31T16:09:28.453 回答