2014-09-24 3 views
0

Я пытаюсь объединить несколько векторов для создания результирующего вектора, который является объединением элементов во входных векторах, используя STL в C++. Каждый вход уже находится в отсортированном порядке, а элементы - без знака.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 затем копируется в массив C++ без знака short по коду, не показанному здесь).

ответ

4

temp имеет нулевой размер, поэтому set_union пишет за его конец. Изменить что

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

Demo

Update: Почему вектор температуры не приводит к увеличению размера автоматически?
Представьте 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

+0

@ Woody20 Я попытался объяснить, см. Мой обновленный ответ. –

Смежные вопросы