如何获取std :: map的前n个元素

时间:2009-11-27 14:57:24

标签: c++ resize stdmap shrink

由于C ++ std :: map中没有.resize()成员函数,我想知道如何获得最多n个元素的std :: map。

显而易见的解决方案是创建一个从0到n的循环,并使用第n个迭代器作为std :: erase()的第一个参数。

我想知道是否有任何解决方案不需要循环(至少不在我的用户代码中),而且更像是“STL方式”。

5 个答案:

答案 0 :(得分:13)

您可以使用std::advance( iter, numberofsteps )

答案 1 :(得分:3)

几乎所有容器的通用解决方案,例如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());
}

答案 2 :(得分:1)

正确的方法是使用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());

答案 3 :(得分:0)

为什么要调整地图大小?

地图中的元素不会以任何顺序存储 - 第一个'n'并不意味着什么

编辑:
有趣的是std :: map确实有一个订单,不知道这个概念有多么有用 条目是否与键的排序顺序相同?
那是什么意思?如果您有SSN键入的名称,那么这些名称是否以SSN数字顺序存储?

答案 4 :(得分:0)

std :: map不是列表。没有“前n个”元素。

BTW:如果容器被更改,迭代器将变为无效。

如果你真的需要一个较小的地图,你可以迭代它并将所有元素添加到第n个地图中。