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

发布于 2024-08-12 21:19:49 字数 197 浏览 9 评论 0原文

由于 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

江湖正好 2024-08-19 21:19:49

您可以使用 std::advance( iter, numberofsteps ) 来实现此目的。

You can use std::advance( iter, numberofsteps ) for that.

爺獨霸怡葒院 2024-08-19 21:19:49

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

Universal solution for almost any container, such as std::list, std::map, boost::multi_index. You must check the size of your map only.

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());
}
御守 2024-08-19 21:19:49

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

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.

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());
一生独一 2024-08-19 21:19:49

只需使用这个简单的代码

    int cnt = n;
    for(auto it = mp.cbegin(); it != mp.cend(); ++it)
    {
        if(cnt == 0) {
            return;
        }
        cout << it->first << "" << it->second << endl;
        cnt--;
    }

Just use this simple code

    int cnt = n;
    for(auto it = mp.cbegin(); it != mp.cend(); ++it)
    {
        if(cnt == 0) {
            return;
        }
        cout << it->first << "" << it->second << endl;
        cnt--;
    }
赏烟花じ飞满天 2024-08-19 21:19:49

为什么要调整地图大小?

地图中的元素不以任何顺序存储 - 第一个“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?

红颜悴 2024-08-19 21:19:49

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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文