2014-09-24 101 views
0

我正在嘗試合併多個向量來創建一個結果向量,該向量是輸入向量中元素的聯合,使用C++中的STL。每個輸入已經按排序順序排列,並且元素無符號短。C++ STL set_union獲取錯誤向量迭代器+偏移量超出範圍

我得到一個錯誤「表達式:向量迭代器+偏移量超出範圍」,我不知道爲什麼。這是一個調試版本,在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)波長的矢量將被合併到載體WL。 (然後將這個向量wl複製到一個未簽名short的C++數組中,此處未顯示代碼)。

回答

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正在做的,這就是爲什麼它在這裏需要。

+0

我想我理解你的建議,但你能解釋爲什麼矢量溫度不會自動增加大小嗎?我認爲這是矢量容器的目的:根據需要進行擴展。 – Woody20 2014-09-25 16:21:47

+0

@ Woody20我試着解釋,看我更新的答案。 – 2014-09-25 18:33:26