boost :: range用于处理容器的内容,并使用地图中的值来管道到下一个流程

时间:2016-09-13 12:16:10

标签: c++ boost stl

我有一张像std::map<std::string, std::vector<int> >这样的地图。我想从地图的值中创建所有子矢量中的一个矢量。我可以使用循环来完成它,但我想使用boost::range库,我可以将一个转换的输入传递给另一个转换,以便代码更具可读性和简洁性。我尝试了类似下面的内容,但需要一些帮助才能正确完成。 谢谢

#include <boost/range/adaptor/filtered.hpp>
#include <boost/range/algorithm/copy.hpp>
#include <iterator>
#include <vector>
#include <map>
#include <iostream>

struct GetMapValue 
{
    template<typename T1, typename T2>
    const T2& operator()( const std::pair<T1,T2>& key_val ) const
    { 
       return key_val.second;
    }
};

struct GetINTs 
{
    GetINTs(std::vector<int> aVec1)
    {
        aMyVec = aVec1;
    }
    void operator()( const std::vector<int>& val )
    { 
        aMyVec.insert( val.end(), val.begin(), aMyVec.end() );
    }
    private:
    std::vector<int> aMyVec;

};

int main(){

std::map<std::string,  std::vector<int> > x;
std::vector<int> y, z;

std::vector<int> temp;
temp.push_back(1);
temp.push_back(1);
x.insert(std::make_pair("one", temp));

temp.clear();
temp.push_back(2);
temp.push_back(2);
x.insert(std::make_pair("two", temp));

temp.clear();
temp.push_back(3);
temp.push_back(3);
x.insert(std::make_pair("three", temp));

boost::copy( x | boost::adaptors::transformed(GetMapValue),     std::back_inserter(y) );
boost::copy( y | boost::adaptors::transformed(GetINTs), std::back_inserter(z) );

}

1 个答案:

答案 0 :(得分:1)

适配器已存在且名为

以下是一个示例:

<强> Live On Coliru

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

int main() {
    std::map<std::string, std::vector<int> > x {
        { "hello", { 1,2,3 } },
        { "world", { 4,5,6 } },
    };

    boost::copy(x | boost::adaptors::map_keys, std::ostream_iterator<std::string>(std::cout << "Keys: ", " "));
    for (auto& vec : x | boost::adaptors::map_values)
        boost::copy(vec, std::ostream_iterator<int>(std::cout << "\nValues: ", " "));
}

打印

Keys: hello world 
Values: 1 2 3 
Values: 4 5 6