Невозможно использовать 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())
);
Другие вопросы по тегам