Итерация по std :: map <X, std :: vector <Y>> и сортировка векторов - PullRequest
4 голосов
/ 24 ноября 2010

При итерации по std::map<X,std::vector<Y> > могу ли я отсортировать векторы или это может сделать недействительным итератор?

Другими словами, в порядке ли следующий код?

typedef std::map<int, std::vector<int> > Map;
Map m;
for (Map::iterator it = m.begin(); it != m.end(); ++it) {
  std::sort(it->second.begin(), it->second.end());
}

Ответы [ 4 ]

6 голосов
/ 24 ноября 2010

Ваш код в порядке.Итераторы из map становятся недействительными только при удалении элементов с карты.Изменение элемента контейнера STL никогда не делает недействительными итераторы этого контейнера, а только операции над самим контейнером, такие как удаление или иногда добавление элементов.

2 голосов
/ 24 ноября 2010

Некоторая дезинформация здесь, поэтому в нее будут встраиваться. Std :: maps являются своего рода особыми в том смысле, что вы можете вставлять новые элементы без аннулирования существующих итераторов, а удаление элемента делает недействительными любые итераторы для этого конкретного элемента. При наличии итератора на карте вы не можете изменять ключ (в противном случае порядок сортировки будет поврежден - один из инвариантов контейнера), но вы можете изменять значения по своему усмотрению. Сортировка вашего массива относится к этой последней категории операций, и она отлично работает.

Цитировать со страницы SGI STL: http://www.sgi.com/tech/stl/Map.html

Карта имеет важное свойство, заключающееся в том, что вставка нового элемента в карту не делает недействительными итераторы, которые указывают на существующие элементы. Стирание элемента с карты также не делает недействительными никакие итераторы, за исключением, конечно, итераторов, которые фактически указывают на удаляемый элемент.

2 голосов
/ 24 ноября 2010

Ваш код в порядке.На самом деле у вас не должно быть никаких сомнений, поскольку вы не вставляете и не удаляете элементы из map: структура map не изменяется, вы влияете только на сохраненные значения.

0 голосов
/ 24 ноября 2010

Как говорит Ашеплер, ваш код в порядке.Я бы только добавил, что есть различие между вектором, который имеет карта в качестве цели, и значениями внутри любого из векторов.Из-за этого вы можете изменять значения внутри векторов, не влияя на карту.

...