2017-02-15 11 views
3

Я хочу использовать boost: range utilities для преобразования вектора и поместить исходные элементы в виде ключей и преобразованных элементов в качестве значений в std :: map. Я придумал что-то вроде ниже. Как видно, мне не хватает способа вставить элементы на последнем шаге. Не могли бы вы мне помочь?boost :: range как вставлять элементы в карту с входным каналом

#include <iostream> 
#include <vector> 
#include <map> 
#include <string> 
#include <boost/range/adaptors.hpp> 
#include <boost/range/algorithm/copy.hpp> 

const std::vector<int> vec = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; 

void doSomething(int i) 
{ 
    // Do Something 
} 

/** Map integers to the alphabet: 0->a, 1->b, ... */ 
std::string alphabetize(int i) 
{ 
    return std::string(1, 'a' + i); 
} 

int main() 
{ 
    std::map<std::string, int > myMap; 
    boost::copy(vec | boost::adaptors::transformed(alphabetize), std::inserter(myMap, myMap.end())); 
} 

Чтобы продлить его дальше, как я могу использовать for_each для вызова функции для всех элементов, как этот

boost::range::for_each(myMap | boost::adaptors::map_value, doSomething); 

ответ

3

Просто сделать функцию, которая возвращает пару, а не строка.

std::pair<std::string, int> alphabetize(int i) 
{ 
    return std::make_pair(std::string(1, 'a' + i), i); 
} 
+0

просто 'возвращение {станд :: строка (1, 'а' + я), я};' также работает – TemplateRex

+0

@TemplateRex Ну, вы. Но в коде нет C++ 11, поэтому я изменяю функцию без C++ 11. – ForEveR

+0

Блестящий, мне не приходило в голову. Я просто пытался отложить алгоритм диапазона – polapts