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