2016-07-19 5 views
-2

私はstd::map<std::string, std::vector<int>>を持っています。同じタイプの変数をとる関数にそのマップの「ビュー」を提供する方法はありますか?具体的には、マップ内のベクトルをスライスする方法はありますが、std :: mapインタフェースに準拠したビュー(スライス)を提供していますか? boost範囲アダプタまたはインデックスと似ていますが、ネストされた構造のものです。マップ内のスライスベクトル

私は主にboostで何かを探していますが、私は他の提案も公開しています。

[UPDATE]目的は、マップをコピーまたは移動しないようにすることです。スライス基準に従ってベクトルにアクセスするだけです。マップを変数として取る関数は、スライスを意識してはいけません。これが問題をより明確にすることを願っています。

ここで擬似例です:

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

なぜダウン投票?その質問についてはっきりしないものは何ですか? – John

+0

あなたはboost :: interval_setが好きかもしれません - しかし、与えられたように、あなたのサンプルはあなたが望むものを表示しませんので、私は助言しません – sehe

答えて

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()); 
    } 
} 
0
(auto a)[&]{ auto bounds = slices[a]; 
       auto v = mymap[a]; 
       return find(v.begin(),v.end(), bounds.first);} 

これは、例えばはあなたの残りの部分はラムダと些細なことする必要があり、あなたの基準に基づいて、前縁部にイテレータを取得します。

0

魔法はこの試みる必要:

auto& ref_map = my_map["a"]; 
auto& ref_slice = slices["a"]; 
std::cout << "a: "; 
std::copy ( 
    ref_map.begin() + ref_slice.first, 
    ref_map.begin() + ref_slice.second, 
    std::ostream_iterator<int> (std::cout,", ") 
); 
関連する問題