Карты не обеспечивают лучше, чем линейный доступ к элементам по индексу, например vector
или deque
.Вы можете сделать это, используя std::advance
, но это занимает время, пропорциональное k
.Если k
мало, оно часто будет достаточно быстрым - оно в основном включает в себя следующие k
указатели.Вот пример:
template<typename Map>
void erase_last_elements(Map & map, ptrdiff_t k)
{
assert(k >= 0);
assert(map.size() >= (size_t)k);
typename Map::iterator i = map.end();
std::advance(i, -k);
map.erase(i, map.end());
}
В качестве альтернативы, если вы используете Boost, вы можете использовать boost::prior
:
template<typename Map>
void erase_last_elements(Map & map, ptrdiff_t k)
{
assert(k >= 0);
assert(map.size() >= (size_t)k);
typename Map::iterator i = boost::prior(map.end(), k);
map.erase(i, map.end());
}
В противном случае вам придется поддерживать отдельный индекс,или используйте другой контейнер.Может пригодиться что-то вроде отсортированного vector
, если вы не слишком много вставляете и удаляете элементы.