C++容器上的分段故障循环

Seg Fault Looping over C++ containers

本文关键字:分段 故障 循环 C++      更新时间:2023-10-16

以下是代码(查找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需要一个有效的输出迭代器,因为应该允许它在该迭代器上进行写入。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_inserter返回的back_insert_iterator是一个适合在这里使用的输出迭代器:它将为set_union分配给它的每个项调用v.push_back


在你的平台上留言&环境:

一般来说,你应该确保你的核心文件大小限制是非零的(除非你在写大量的程序,否则就不受限制(,并学会用调试器检查核心文件。