由于C++中没有.resize()成员函数std::map,我想知道如何获得最多n个元素的std::map。显而易见的解决方案是创建一个从0到n的循环,并使用第n个迭代器作为std::erase()的第一个参数。我想知道是否有任何解决方案不需要循环(至少在我的用户代码中不需要),并且更“STL的方式”。
d6kp6zgx1#
你可以使用std::advance( iter, numberofsteps )来实现。
std::advance( iter, numberofsteps )
2nc8po8w2#
几乎任何容器的通用解决方案,如std::list,std::map,boost::multi_index。您必须仅检查Map的大小。
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()); }
roqulrg33#
正确的方法是使用std::advance。但这里有一个有趣的(缓慢的)方式允许“使用Map上的大小调整”。更一般地说,这种技巧可以用于其他工作在矢量上而不是在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());
oxiaedzo4#
就用这个简单的代码
int cnt = n; for(auto it = mp.cbegin(); it != mp.cend(); ++it) { if(cnt == 0) { return; } cout << it->first << "" << it->second << endl; cnt--; }
ffdz8vbo5#
为什么要调整Map的大小?map中的元素不按任何顺序存储-第一个'n'实际上没有任何意义编辑:有趣的是std::map确实有一个顺序,不确定这个概念有多有用。条目的排序顺序是否与键的排序顺序相同?那是什么意思?如果你的名字是由SSN键控的,这是否意味着名字是以SSN的数字顺序存储的?
vfh0ocws6#
std::map不是列表。没有“前n个”元素。顺便说一句:如果容器被改变,迭代器将变得无效。如果你真的需要一个更小的map,你可以迭代它,并将所有元素添加到一个新的map中。
6条答案
按热度按时间d6kp6zgx1#
你可以使用
std::advance( iter, numberofsteps )
来实现。2nc8po8w2#
几乎任何容器的通用解决方案,如std::list,std::map,boost::multi_index。您必须仅检查Map的大小。
roqulrg33#
正确的方法是使用std::advance。但这里有一个有趣的(缓慢的)方式允许“使用Map上的大小调整”。更一般地说,这种技巧可以用于其他工作在矢量上而不是在Map上的东西。
oxiaedzo4#
就用这个简单的代码
ffdz8vbo5#
为什么要调整Map的大小?
map中的元素不按任何顺序存储-第一个'n'实际上没有任何意义
编辑:
有趣的是std::map确实有一个顺序,不确定这个概念有多有用。
条目的排序顺序是否与键的排序顺序相同?
那是什么意思?如果你的名字是由SSN键控的,这是否意味着名字是以SSN的数字顺序存储的?
vfh0ocws6#
std::map不是列表。没有“前n个”元素。
顺便说一句:如果容器被改变,迭代器将变得无效。
如果你真的需要一个更小的map,你可以迭代它,并将所有元素添加到一个新的map中。