[英]Seg Fault Looping over C++ containers
这是代码(查找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
我在哪里弄糟?
v
为空,因此无法写入v.begin()
。 您应该改用std::back_inserter(v)
。
在应该允许set_union
写入该迭代器的意义上, set_union
期望有效的输出迭代器。 v
是空的,因此v.begin()
不是有效的迭代器。
尝试将向量声明为
std::vector<long long> v(42);
为了清楚起见:如果在set_union
行之前刷新std::cout
,则应该看到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
。
通常,您应确保核心文件大小限制为非零(除非编写大型程序,否则请使其不受限制),并学会使用调试器检查核心文件。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.