在地图中获取指向struct的指针

时间:2018-05-31 03:21:28

标签: c++

我正在尝试将以下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

1 个答案:

答案 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 ) ); } );