地图内的切片向量

时间:2016-07-19 02:39:52

标签: c++ boost

我有std::map<std::string, std::vector<int>>。有没有办法提供该视图的“视图”到一个采用相同类型的变量的函数?具体来说,有没有办法切片地图中的向量,但提供符合std :: map接口的视图(切片)?类似于boost范围的适配器或索引,但适用于嵌套结构。

我主要是通过boost寻找一些东西,但我也愿意接受其他建议。

[更新]目标是“不”复制或移动地图,只根据切片标准访问其矢量。将地图作为变量的函数不应该知道切片。我希望这会使问题更清楚。

这是一个伪示例:

map<string, vector<int>> my_map; 
my_map["a"] = {0,1,2,3,4,5};
my_map["b"] = {0,1,2,3,4,5};
my_map["c"] = {0,1,2,3,4,5};

map<string, pair<int>> slices;
slices["a"] = {1,4};
slices["b"] = {2,3};
slices["c"] = {0,5};

map_view = magic(my_map, slices);

cout << "a: " << print_vector(map_view["a"]) << endl;
cout << "b: " << print_vector(map_view["b"]) << endl;
cout << "c: " << print_vector(map_view["c"]) << endl;

//desired output

a: 1,2,3
b: 2
c: 0,1,2,3,4

3 个答案:

答案 0 :(得分:0)

( auto a)[&]{ auto bounds = slices[a];
              auto v = mymap[a];
              return find(v.begin(),v.end(), bounds.first);}

例如,根据您的标准,这将使您获得前边缘的迭代器,其余部分应该与lambdas无关。

答案 1 :(得分:0)

不需要魔法试试这个:

FOR bRow IN (SELECT MI_PRINX, geoloc, ROWID FROM ORAHAN where MI_PRINX>aRow.MI_PRINX)

答案 2 :(得分:0)

我最终添加了一个采用其中一个贴图值和切片标准的函数,然后根据切片标准在多个提升切片上返回一个连接的提升范围。除此之外,我还使用了auto C ++ 14的返回类型推断,以避免搞乱升压适配器和范围的实际返回类型。

这是一个快速摘录:

const auto get_map_view(
    string key, 
    const map<string, vector<int>> & my_map, 
    const pair<int,int> & slice, bool exclude=false) {

    const auto & values = my_map.at(key);

    if (!exclude) {
        return boost::range::join(
            values | boost::adaptors::sliced(0, 0),
            values | boost::adaptors::sliced(slice.first, slice.second));
    } else {
        return boost::range::join(
            values | boost::adaptors::sliced(0, slice.first),
            values | boost::adaptors::sliced(slice.second, values.size());
    }
}