2013-07-19 2 views
0

'left' is std :: vector of std :: set для каждого элемента в левом (который установлен), я пытаюсь выполнить операцию объединения в другой набор, итерации по 'left' ,set union не работает

Почему следующий код не работает. Я пытаюсь сделать набор объединений двух множеств.

std::vector<std::set<int> > left(num_nodes); 
//Both leftv and left are not empty ....there is some code here which fills them. 
std::set<int> leftv, dummy; 

for(std::set<int>::iterator u = leftv.begin(); u != leftv.end() ;u++){ 
    dummy.insert(v);   //v is some integer 
    std::set_union (left[*u].begin(), left[*u].end(), dummy.begin(), dummy.end(), left[*u].begin()); 
    dummy.clear(); 
} 

Ошибка /usr/include/c++/4.3/bits/stl_algo.h:5078: ошибка: назначение только для чтения местоположения «__result.std :: _ Rb_tree_const_iterator < _Tp> :: оператора * с _Tp = int '

+2

Не могли бы Вы уточнить, что ** ** не работает. Ошибки компилятора? Runtime crash? –

+1

Ваша проблема не в союзе, а в том, как вы пытаетесь итерации. Что вы пытаетесь объединить вместе? (левый только что должен быть объединением всех множеств слева?) – IdeaHat

+0

Если это все соответствующий код, то 'leftv' пуст, когда цикл' for' достигнут, так что вам нечего перебирать. – Angew

ответ

1

Вы пытаетесь перезаписать содержимое набора, указав left[*u].begin() в качестве выходного аргумента set_union. Элементы набора не могут быть изменены, поскольку их значение определяет их положение в наборе. Даже если бы вы могли, вам нужно было бы выращивать контейнер для размещения дополнительных элементов, а не просто перезаписывать существующие; и выход не должен перекрываться с любым диапазоном ввода. Подводя итог: вы не можете использовать set_union для вставки содержимого одного набора в другой.

Если вы хотите добавить содержимое dummy в left[*u], а затем вставьте каждый элемент:

std::copy(dummy.begin(), dummy.end(), std::inserter(left[*u])); 
Смежные вопросы