这是代码(找到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
我在哪里陷入困境?
答案 0 :(得分:8)
v
为空,因此无法写入v.begin()
。您应该使用std::back_inserter(v)
代替。
答案 1 :(得分:6)
set_union
期望一个有效的输出迭代器,因为应该允许它在该迭代器上写入。 <{1}}为空,因此v
不是有效的迭代器。
尝试将矢量声明为
v.begin()
答案 2 :(得分: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
返回的back_inserter
是一个适合在此处使用的输出迭代器:它会为v.push_back
分配给它的每个项目调用set_union
。
通常,您应确保您的核心文件大小限制为非零(除非您正在编写大量程序,否则只能使其无限制),并学习使用调试器检查核心文件。