使用给定键填充具有所有多图值的矢量

Mr.*_*Boy 10 c++ stl

给定multimap<A,B>M什么是vector<B>用特定键在M中创建所有值的简洁方法.

例如,给定一个multimap我如何获得映射到值123的所有字符串的向量?

一个答案很简单,从较低循环>上限,但有一个整洁的无环路的方法是什么?

rep*_*vsd 6

这是STL风格的方法:

// The following define is needed for select2nd with DinkumWare STL under VC++
#define _HAS_TRADITIONAL_STL 1

#include <algorithm>
#include <vector>
#include <map>
#include <string>
#include <functional>
#include <map>
#include <iterator>
#include <iostream>

using namespace std;

void main()
{
    typedef multimap<string, int> MapType;
    MapType m;
    vector<int> v;

    // Test data
    for(int i = 0; i < 10; ++i)
    {
        m.insert(make_pair("123", i * 2));
        m.insert(make_pair("12", i));
    }

    MapType::iterator i = m.lower_bound("123");
    MapType::iterator j = m.upper_bound("123");

    transform(i, j, back_inserter(v), select2nd<MapType::value_type>());

    copy(v.begin(), v.end(),  ostream_iterator<int>(cout, ","));

}
Run Code Online (Sandbox Code Playgroud)


小智 5

让我们去拉姆达

给出: multimap<A,B> M

请求:vector<B>(M 中具有特定键“a”的所有值。)

方法:

std::pair<M::iterator, M::iterator> aRange = M.equal_range('a')
std::vector<B> aVector;
std::transform(aRange.first, aRange.second,std::back_inserter(aVector), [](std::pair<A,B> element){return element.second;});         
Run Code Online (Sandbox Code Playgroud)

系统环境:

  1. 编译器:gcc(Ubuntu 5.3.1-14ubuntu2.1)5.3.1 20160413(使用 -std=c++11)
  2. 操作系统:ubuntu 16.04

代码示例:

#include <algorithm>
#include <vector>
#include <map>
#include <string>
#include <functional>
#include <iostream>

int main()
{
    typedef std::multimap<std::string, int> MapType;
    MapType m;
    std::vector<int> v;

    /// Test data
    for(int i = 0; i < 10; ++i)
    {
        m.insert(std::make_pair("123", i * 2));
        m.insert(std::make_pair("12", i));
    }

    std::pair<MapType::iterator,MapType::iterator> aRange = m.equal_range("123");

    std::transform(aRange.first, aRange.second, std::back_inserter(v), [](std::pair<std::string,int> element){return element.second;});

    for(auto & elem: v)
    {
        std::cout << elem << std::endl;
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)