我有一张像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) );
}
答案 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