Невозможно использовать set_intersection на std::set
Я пытаюсь использовать set_intersection, как указано ниже
std::set<std::pair<char*, int>,FileLinePairComapare > netSet;
std::set<std::pair<char*, int>,FileLinePairComapare > portSet;
std::set<std::pair<char*, int>,FileLinePairComapare> result;
std::set<std::pair<char*, int>,FileLinePairComapare>::iterator it;
std::set_intersection(netSet.begin(),netSet.end(),portSet.begin(),portSet.end(),result.begin());
Я получаю ошибку компиляции в последней строке
В экземпляре '_OIter std::set_intersection(_IIter1, _IIter1, _IIter2, _IIter2, _OIter) [with _IIter1 = std::_Rb_tree_const_iterator >; _IIter2 = std::_Rb_tree_const_iterator >; _OIter = std::_Rb_tree_const_iterator >] ':
передача 'const std:: pair' в качестве 'this' аргумента 'std::pair& std::pair::operator=(const std::pair&)' отменяет квалификаторы [-fpermissive]
Там нет функции cons, где я использую эти наборы и set_intersection .
1 ответ
Вы не можете использовать алгоритмы для записи в std::set
итератор напрямую. Все итераторы множеств являются константными, и на то есть веская причина, поскольку изменение любого значения приведет к повреждению дерева (то же самое относится и к std::map
ключи - итераторы карты могут изменять только отображенное значение).
Даже если бы вы могли, это не сработало бы, потому что контейнер пуст (например, если вы пытались использовать std::vector
в качестве целевого контейнера вы получите неопределенное поведение).
Использовать std::inserter
std::set_intersection(
netSet.begin(), netSet.end(),
portSet.begin(), portSet.end(),
std::inserter(result, result.end())
);