Boost::range用于处理容器的内容,并将映射中的值管道到下一个进程

boost::range to process content of a container and pipe to next process with values from a map

本文关键字:映射 管道 下一个 进程 用于 range 处理 Boost      更新时间:2023-10-16

我有一个像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) );
}

适配器已经存在并且被称为

  • boost::adaptors::map_keys
  • boost::adaptors::map_values

下面是一个示例:

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