2016-04-24 2 views
1

をLOWER_BOUND使用して、ネストされたマップは、値としてキーと年齢とIDが含まれています。私は地図を印刷するとき、それは必要な値を印刷します。私は文字列は、学生の名前が含まれてい</p> <pre><code>map<string , map<int,int>> </code></pre> <p>のように見えるの地図を持って、ネストされた地図上

しかし、特定のID以下の学生を探したいです。私が使用してLOWER_BOUND使用してみました:

for(auto &x : class){  
    auto it = x.second.upper_bound(some_number); 
    for(; it != x .second.begin() ; --it){ 
     cout << x.first << " = " << << it -> first << " " <<it -> second << endl;  
    } 
} 

これは確かに学生の権利名前を出力しますが、そのIDと年齢は、この動作を引き起こしているものを、ちょうどゼロまたはランダムな数字ですか?私はそれを印刷するだけで動作します。

私はこれについてcpp map referenceで見つけようとしましたが、何も見つかりませんでした。まず、それはsome_numberより厳密に大きいIDを持つイテレータを見つけ、

for(auto &x : Class){  
    auto it = x.second.upper_bound(some_number); 
    while(it!=x.second.begin()){ 
     it=prev(it); 
     cout<< x.first<< " = "<< it->first<< " "<< it->second<< endl; 
    } 
} 

があるんどのようなコード上記

std::map::upper_boundを参照してください。

+0

[、最小完全、かつ検証例]を取得することは可能であろう(http://stackoverflow.com/help/mcve) – JVApen

+2

これは奇妙なデータ構造です。 1人の学生が自分の名前で識別され、複数のIDと年齢を持つことができますか? –

+0

'class'というマップをどのように宣言しましたか? –

答えて

2

次のコードは、あなたの問題を解決します。今度は "特定のID以下の生徒"を印刷したいので、IDのすべてが戻り値upper_boundよりも小さいものを出力します。
イテレータがそれ自身である場合、つまり、イテレータがそれよりも小さいIDを持っていないことを意味します。


また、データ構造が奇妙な場合は、生徒IDをプライマリインデックスにする必要があります。

map<int, pair<string,int> >は、より適切なデータ構造になります。 (ほとんどの場合ユニークなIDを仮定します)。
OOPの概念を使用すると、より多くのことができます。

+0

'x_second.end()'(つまり、マップに存在しない)を返す場合、 'upper_bound'の戻り値をチェックしてはいけませんか? –

+0

upper_boundが 'it = x.second.end()'を返した場合、 'prev(it)'はマップの最後の要素を指します。だから、すべてのIDを 'x.second.begin() 'まで出力する –

0

おそらく未定義の動作ですが、std::map::upper_boundはいくつかの条件ではイテレータを返し、コードからはこの条件をチェックするようには見えません。また、マップの変数名としてclassキーワードを使用しないでください。コンパイルされないようにしてください。以下は、すべてのID少ないこのIDを含むいくつかの数よりもUBとプリントなしで動作するはずのサンプルコードです:

http://coliru.stacked-crooked.com/a/efae1ae4faa3e656

map< string , map<int,int>> classes ={ 
    { "k1", {{1,1},{2,2},{3,3}} } 
}; 

//int class; 

int some_number = 4; 
for(auto &x : classes){  
    auto it_num_end = x.second.upper_bound(some_number); // some numberis just variable that contains number 
    for(auto it = x.second.begin(); it != it_num_end ; ++it){ 
    cout << x.first << " = " << it -> first << " " <<it -> second << endl;  
    }  
} 
+0

これは意図した出力を生成しません。 some_numberが0の場合、それでも 'k1 = 1 1'が出力されます。期待される出力はnoneにする必要があります。 –

+0

@RishitSanmukhaniもし私が思ったよりも簡単なものを見落とさなければ、私は更新しました。 – marcinj

関連する問題