Как получить первые n элементов std:: map

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

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

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

5 ответов


можно использовать 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());
}

a std::map не является списком. Нет никаких "первых n" элементов.

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

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


правильный способ для этого-использовать 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());

Почему вы хотите изменить размер карты?

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

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