Вопрос

Поскольку в C ++ std::map нет функции-члена .resize(), мне было интересно, как можно получить std ::map, содержащий не более n элементов.

Очевидным решением является создание цикла от 0 до n и использование n-го итератора в качестве первого параметра для std::erase().

Мне было интересно, есть ли какое-либо решение, которое не нуждается в цикле (по крайней мере, не в моем пользовательском коде) и является скорее "способом STL".

Это было полезно?

Решение

Для этого вы можете использовать std :: advance (iter, numberofsteps) .

Другие советы

Универсальное решение практически для любого контейнера, такого как std :: list, std :: map, boost :: multi_index. Вы должны проверить только размер своей карты.

template<class It>
It myadvance(It it, size_t n) {
   std::advance(it, n);
   return it;
}

template<class Cont>
void resize_container(Cont & cont, size_t n) {
    cont.erase(myadvance(cont.begin(), std::min(n, cont.size())), 
                 cont.end());
}

Правильный способ для этого - использовать std :: advance. Но вот забавный (медленный) способ, позволяющий «использовать изменение размера на карте». В целом, этот вид трюка может использоваться для других вещей, работающих с вектором, но не с картой.

map<K,V> m; //your map
vector< pair<K,V> > v(m.begin(), m.end());
v.resize(n);
m = map<K,V>(v.begin(),v.end());

std :: map - это не список. Здесь нет "первых n" элементы.

Кстати: итераторы становятся недействительными, если контейнер изменяется.

Если вам действительно нужна карта меньшего размера, вы можете перебрать ее и добавить все элементы до n-го в новую карту.

Зачем вам изменять размер карты?

Элементы на карте не хранятся ни в каком порядке - первая буква "n" на самом деле ничего не значит

Редактировать:
Интересно, что в std::map действительно есть порядок, не уверен, насколько полезна эта концепция.
Находятся ли записи в том же порядке сортировки, что и ключи?
Что это значит?Если у вас есть имена с ключом SSN, означает ли это, что имена хранятся в числовом порядке SSN?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top