我正在尝试将以下o1
转换为r1
:
map<int, vector<vector<myStruct>>> o1;
map<int, vector<vector<myStruct*>>> r1;
for(int i = 0; i < o1.size(); ++i)
{
auto element = o1[i];
vector<vector<myStruct*> tmp;
for(int j = 0; j < element.size(); ++j)
{
tmp.push_back({});
for(int k = 0; k < element[j].size(); ++k)
{
tmp[j].push_back(&element[j][k]);
}
}
r1[i] = tmp;
}
但是我注意到,在循环结束时,element
中不再存在r1
。如何编写它以使element
的指针仍然存在于r1
?
答案 0 :(得分:1)
最好使用标准算法std::transform
并逐步执行此操作:
首先我们将std::vector<myStruct>
转换为std::vector<myStruct*>
:
auto cnv_v = []( std::vector<myStruct> &v ) {
std::vector<myStruct*> r;
std::transform( v.begin(), v.end(), std::back_inserter( r ),
[]( myStruct &ms ) { return std::adressof( ms ); }
);
return r;
};
现在我们可以转换矢量矢量:
auto cnv_vv = []( std::vector<std::vector<myStruct>> &v ) {
std::vector<std::vector<myStruct*>> r;
std::transform( v.begin(), v.end(), std::back_inserter( r ),
cnv_v );
);
return r;
};
并将它们放在一起以转换std::map
:
std::transform( o1.begin(), o1.end(), std::inserter( r1 ),
[]( auto &p ) { return std::make_pair( p.first, cnv_vv( p.second ) ); } );