Как получить первые n элементов std :: map - PullRequest
6 голосов
/ 27 ноября 2009

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

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

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

Ответы [ 5 ]

13 голосов
/ 27 ноября 2009

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

3 голосов
/ 27 ноября 2009

Универсальное решение практически для любого контейнера, такого как 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());
}
1 голос
/ 27 ноября 2009

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

std :: map - это не список. Нет «первых n» элементов.

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

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

0 голосов
/ 27 ноября 2009

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

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

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

...