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

这是我出现的可能方法之一:


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 keys

transform(m.begin(), m.end(), back_inserter(keys), RetrieveKey());


// Dump all keys

copy(keys.begin(), keys.end(), ostream_iterator<int>(cout, "\n"));

当然,我们还可以通过定义另一个函子RetrieveValues从映射中检索所有值。


还有其他方法可以轻松实现这一目标吗?(我一直想知道为什么std :: map不包含成员函数供我们这样做。)


小怪兽爱吃肉
浏览 1161回答 3
3回答

沧海一幻觉

虽然您的解决方案应该可以工作,但根据其他程序员的技能水平,可能很难阅读。此外,它将功能从呼叫站点移开。这会使维护更加困难。我不确定您的目标是将密钥转换为向量还是将其打印为cout,所以我会同时进行。您可以尝试如下操作:map<int, int> m;vector<int> v;for(map<int,int>::iterator it = m.begin(); it != m.end(); ++it) {&nbsp; v.push_back(it->first);&nbsp; cout << it->first << "\n";}甚至更简单,如果您使用的是Boost:map<int,int> m;pair<int,int> me; // what a map<int, int> is made ofvector<int> v;BOOST_FOREACH(me, m) {&nbsp; v.push_back(me.first);&nbsp; cout << me.first << "\n";}就个人而言,我喜欢BOOST_FOREACH版本,因为键入的次数更少,并且它在做什么方面非常明确。

慕无忌1623718

//c++0x toostd::map<int,int> mapints;std::vector<int> vints;vints.reserve(mapints.size());for(auto const& imap: mapints)&nbsp; &nbsp; vints.push_back(imap.first);

ibeautiful

为此有一个升压范围适配器:vector<int> keys;// Retrieve all keysboost::copy(m | boost::adaptors::map_keys, std::back_inserter(keys));有一个类似的map_values范围适配器可用于提取值。
打开App,查看更多内容
随时随地看视频慕课网APP