2016-11-10 16 views
0

は、だから私は、たとえば、値のマップを持っている:私の現在のコードでマップ内の特定の範囲の値を格納する

1 3 5 7 9 

、私は現在、一定の範囲の間の出現数を見つけることができますよ[低、高]の。

// map::lower_bound/upper_bound 
#include <iostream> 
#include <map> 
using namespace std; 

int main() 
{ 
    map<long,deque<my_struct>> my_map; 
    deque<my_struct> results; 

    mymap[12345].push_back(some_obj); 
    mymap[23456].push_back(some_obj); 
    mymap[34567].push_back(some_obj); 
    mymap[45678].push_back(some_obj); 

    auto low = my_map.lower_bound (12345); 
    auto high = my_map.upper_bound (34567); 

    int num = 0; 
    for (auto it = low; it != high; ++it){ 
     ++num; 
     //how to insert into my results deque? 
    } 
    cout << num << " found\n"; //3found 
    return 0; 
} 

私の質問です:私はこの例では3つのオブジェクトを取得するにはどうすればよい私が持っていた場合たとえば、[3]、[7]私は値3

が私の現在のコードは次のようになり得るでしょう低いと高いの間に存在する?これらの3つのオブジェクトを「結果」デュークに格納して、その範囲内で3つのオブジェクトが見つかりました。私は私の構造体の3つのオブジェクトを押したいと思うが、私は構文を理解するのに苦労している。すべてのヒントや助けをいただければ幸いです!

編集:新しいメソッドを使用しようと

using namespace std; 

struct my_struct{ 
    string value; 
}; 

int main() 
{ 
    map<long,deque<my_struct>> my_map; 
    deque<my_struct> results; 

my_struct entrya; 
entrya.value = "today is a great day"; 

my_struct entryb; 
entryb.value = "today is an okay day"; 

my_struct entryc; 
entryc.value = "today is a bad day"; 


my_map[12345].push_back(entrya); 
my_map[23456].push_back(entryb); 
my_map[34567].push_back(entryc); 


auto low = my_map.lower_bound (12345); 
auto high = my_map.upper_bound (34567); 

int num = 0; 
for (auto it = low; it != high; ++it){ 
    ++num; 
    results.insert(results.back(), it->second.begin(), it->second.end()); 
    //how to insert into my results deque? 
} 
cout << num << " found\n"; //3found 

cout << "testing results\n"; 
for (int i = 0; i < results.size(); i++){ 
    cout << results[i].value << "\n"; 
} 
return 0; 

}

編集:PICバージョンhttps://gyazo.com/4960e067252f23ffafb924fa8e6693eb

答えて

2

lower_boundupper_bound機能は、マップのイテレータを返すので、あなたが本当にしているものイテレータを介してマップに格納されたオブジェクトにアクセスする方法を尋ねます。

マップのイテレータは、std::pairを指します。最初の要素はキーで、2番目の要素は値です。したがって、保存された値を取得するには、it->secondを使用します。

マップの値のタイプは実際にstd::deque<my_struct>なので、すべてのデータを単一のデキューresultsに連結したいと考えられます。これはstd::deque::insertの機能を使用して次のように機能します。

//how to insert into my results deque? 
results.insert(result.end(), it->second.begin(), it->second.end()); 
+1

ありがとうございました。コード例を読んだとき、私は少し怠惰でした。 – paddy

+0

こんにちは、私はまだ@ 1201ProgramAlarmのメソッドを使用して少し問題があります。私はあなたがまだ助けることができるかどうか疑問に思っていた。この関数は理にかなっていて、私はSTLでそれを調べました。しかし、Xcodeはまだそれをコンパイルすることを拒否しています。私はメインポストの編集でそれを投げた。それがまだ失敗する理由を知っていますか? – MMM

+0

私はそれを得た!両方ともありがとう! – MMM

関連する問題