如何获取 std::map 的前 n 个元素
由于 C++ std::map 中没有 .resize() 成员函数,我想知道如何获得最多包含 n 个元素的 std::map 。
显而易见的解决方案是创建一个从 0 到 n 的循环,并使用第 n 个迭代器作为 std::erase() 的第一个参数。
我想知道是否有任何解决方案不需要循环(至少在我的用户代码中不需要)并且更像是“STL 方式”。
Since there is no .resize() member function in C++ std::map I was wondering, how one can get a std::map with at most n elements.
The obvious solution is to create a loop from 0 to n and use the nth iterator as the first parameter for std::erase().
I was wondering if there is any solution that does not need the loop (at least not in my user code) and is more "the STL way to go".
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
您可以使用 std::advance( iter, numberofsteps ) 来实现此目的。
You can use
std::advance( iter, numberofsteps )
for that.适用于几乎所有容器的通用解决方案,例如 std::list、std::map、boost::multi_index。您必须仅检查地图的大小。
Universal solution for almost any container, such as std::list, std::map, boost::multi_index. You must check the size of your map only.
正确的方法是使用 std::advance。但这是一种有趣的(缓慢的)方式,允许“在地图上使用调整大小”。更一般地说,这种技巧可以用于矢量上的其他操作,但不能用于地图上。
The correct way for this is to use std::advance. But here is a funny (slow) way allowing to 'use resize on map'. More generally, this kind of trick can be used for other things working on vector but not on map.
只需使用这个简单的代码
Just use this simple code
为什么要调整地图大小?
地图中的元素不以任何顺序存储 - 第一个“n”实际上并不意味着任何
编辑:
有趣的是 std::map 确实有一个顺序,不确定这个概念有多有用。
条目的排序顺序与键的排序顺序相同吗?
这意味着什么?如果您的姓名由 SSN 输入,这是否意味着姓名按 SSN 数字顺序存储?
Why would you want to resize a map?
The elements in a map aren't stored in any order - the first 'n' doesn't really mean anything
edit:
Interestingly std::map does have an order, not sure how useful this concept is.
Are the entries in the same sort order as the keys?
What does that mean? If you have Names keyed by SSN does that mean the names are stored in SSN numeric order?
std::map 不是列表。没有“前 n”个元素。
顺便说一句:如果容器发生更改,迭代器将变得无效。
如果您确实需要一个较小的地图,您可以迭代它并将直到第 n 个的所有元素添加到新地图中。
A std::map is not a list. There are no "first n" elements.
BTW: Iterators become invalid if the container is changed.
If you really need a smaller map you could iterate though it and add all elements up to the n-th into a new map.