7

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

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

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

4

5 回答 5

14

你可以使用std::advance( iter, numberofsteps )它。

于 2009-11-27T15:03:55.293 回答
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());
}
于 2009-11-27T15:20:56.757 回答
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());
于 2009-11-27T16:19:14.343 回答
0

为什么要调整地图大小?

地图中的元素不按任何顺序存储 - 第一个“n”实际上没有任何意义

编辑:
有趣的是 std::map 确实有一个命令,不确定这个概念有多大用处。
条目是否与键的排序顺序相同?
这意味着什么?如果您有由 SSN 键入的名称,这是否意味着名称以 SSN 数字顺序存储?

于 2009-11-27T15:03:05.840 回答
-1

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

顺便说一句:如果容器更改,迭代器将变得无效。

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

于 2009-11-27T15:05:00.933 回答