为了账号安全,请及时绑定邮箱和手机立即绑定

如何从std :: map检索所有键(或值)并将其放入向量中?

如何从std :: map检索所有键(或值)并将其放入向量中?

C++
小怪兽爱吃肉 2019-11-22 16:06:18
这是我出现的可能方法之一:struct RetrieveKey{    template <typename T>    typename T::first_type operator()(T keyValuePair) const    {        return keyValuePair.first;    }};map<int, int> m;vector<int> keys;// Retrieve all keystransform(m.begin(), m.end(), back_inserter(keys), RetrieveKey());// Dump all keyscopy(keys.begin(), keys.end(), ostream_iterator<int>(cout, "\n"));当然,我们还可以通过定义另一个函子RetrieveValues从映射中检索所有值。还有其他方法可以轻松实现这一目标吗?(我一直想知道为什么std :: map不包含成员函数供我们这样做。)
查看完整描述

3 回答

?
沧海一幻觉

TA贡献1824条经验 获得超5个赞

虽然您的解决方案应该可以工作,但根据其他程序员的技能水平,可能很难阅读。此外,它将功能从呼叫站点移开。这会使维护更加困难。


我不确定您的目标是将密钥转换为向量还是将其打印为cout,所以我会同时进行。您可以尝试如下操作:


map<int, int> m;

vector<int> v;

for(map<int,int>::iterator it = m.begin(); it != m.end(); ++it) {

  v.push_back(it->first);

  cout << it->first << "\n";

}

甚至更简单,如果您使用的是Boost:


map<int,int> m;

pair<int,int> me; // what a map<int, int> is made of

vector<int> v;

BOOST_FOREACH(me, m) {

  v.push_back(me.first);

  cout << me.first << "\n";

}

就个人而言,我喜欢BOOST_FOREACH版本,因为键入的次数更少,并且它在做什么方面非常明确。


查看完整回答
反对 回复 2019-11-22
?
慕无忌1623718

TA贡献1744条经验 获得超4个赞

//c++0x too

std::map<int,int> mapints;

std::vector<int> vints;

vints.reserve(mapints.size());

for(auto const& imap: mapints)

    vints.push_back(imap.first);


查看完整回答
反对 回复 2019-11-22
?
ibeautiful

TA贡献1993条经验 获得超5个赞

为此有一个升压范围适配器:


vector<int> keys;

// Retrieve all keys

boost::copy(m | boost::adaptors::map_keys, std::back_inserter(keys));

有一个类似的map_values范围适配器可用于提取值。


查看完整回答
反对 回复 2019-11-22
  • 3 回答
  • 0 关注
  • 1120 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信