Как получить первые n элементов std::map
Вопрос
Поскольку в 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?