C ++ STL set_union获取错误向量迭代器+偏移超出范围

时间:2014-09-24 22:39:32

标签: c++ vector stl set-union

我正在尝试合并几个向量来创建一个结果向量,它是输入向量中元素的并集,使用C ++中的STL。每个输入都已按排序顺序排列,并且元素是无符号短。

我收到错误"表达式:向量迭代器+偏移量超出范围",我不知道为什么。这是一个在Visual Studio 2013调试器中运行的调试版本。

以下是代码:

std::vector <unsigned short> wl, temp;
int iS; std::vector <unsigned short>::iterator oi, it;
for (iS=0; iS<nScans; iS++)
{
    std::vector<unsigned short> sc(scan[iS].wavelength, scan[iS].wavelength + scan[iS].nWavelengths);
    oi=set_union(wl.begin(), wl.end(), sc.begin(), sc.end(), temp.begin());
    wl.assign(temp.begin(), oi); // temp is needed because destination cannot overlap source
}

意图是来自每次扫描(sc)的波长矢量将合并到矢量w1中。 (然后通过此处未显示的代码将向量wl复制到无符号短路的C ++数组中。)

1 个答案:

答案 0 :(得分:4)

temp的大小为零,因此set_union会写出它的结尾。将其更改为

set_union(wl.begin(), wl.end(), sc.begin(), sc.end(), std::back_inserter(temp));
wl = temp;
temp.clear();

Demo

更新:为什么矢量温度不会自动增大?
想象一下temp为空并执行以下代码:

std::vector<unsigned short>::iterator it = temp.begin();
*it = 123; // Undefined behavior
++it;      // UB
*it = 456; // UB

这正是std::set_union正在做的事情。它只是写入您提供的输出迭代器并递增它。但是通常的矢量迭代器不会添加项目,您必须添加push_back的项目。这就是back_inserter正在做的事情,以及这就是为什么需要它。