как присвоить элементу множества пар через результат поиска итератора - PullRequest
0 голосов
/ 09 сентября 2018

У меня есть набор пар, и я хочу изменить второе поле некоторой пары, которое я хочу найти первым:

#include <iostream>
#include <utility>
#include <set>

int main(){
  auto p=std::make_pair(2,3);
  std::set<std::pair<int,int>> s{p};
  auto it=s.find(p);
  it->second=5; // compilation error
  if(it!=s.end()) std::cout << it->second << '\n';
}

Приведенный выше код не может быть скомпилирован, потому что он жалуется, что результат итератора find не может быть присвоен. Однако я не понимаю, почему это константный итератор.

Что не так с вышеизложенным, и как мне назначить пару, на которую указывает результат итератора поиска?

1 Ответ

0 голосов
/ 09 сентября 2018

Это потому, что элементы set не должны быть изменяемыми, так как красно-черное дерево, которое используется для его реализации, логически не дает нам обойтись с реальными узлами. Даже без деталей реализации элементы set не должны быть изменяемыми (как указано в одном из комментариев выше), иначе мы могли бы изменить {2,3} на {2,2}, что было бы бессмысленно.

...