C言語関係掲示板

過去ログ

No.1252 mapで一番最後の要素を取得する方法(C++ STL)

[戻る] [ホームページ]
No.2585

mapで一番最後の要素を取得する方法
投稿者---愛子(2004/08/30 14:00:35)


STLについて勉強し始めた者です。

map<unsigned int, unsigned int> data;

data[3]=10;
data[2]=5;
data[4]=3;
と入れていくとソートされて
data[2]=5;
data[3]=10;
data[4]=3;
となりますよね。

そこで、一番最初の要素(key名)を取得したい時は、
map<unsigned int, unsigned int>::iterator it;
it = data.begin();
cout << "一番最初の要素=" << it->first << endl;
で取り出せます。
が、一番最後の要素(key名)を取得したい時は、
it = data.end();
ではダメですよね?
endはシーケンスの最後の要素の次の要素を指すイテレータを返すからです。

では、一番最後の要素を取り出す時は、どのようにしたら
いいのでしょうか?
for (it = data.begin(); it != data.end(); it++);
としてから
cout << "一番最後の要素=" << it->first << endl;
とやるしかないのでしょうか?

it = data.end()-1;
は、コンパイルエラーになってしまいました。(T_T)

どなたかご存知の方、宜しくお願いします。



No.2587

Re:mapで一番最後の要素を取得する方法
投稿者---Ban(2004/08/30 14:35:35)


map::rbegin でいかがでしょうか。




No.2589

Re:mapで一番最後の要素を取得する方法
投稿者---Ban(2004/08/30 14:44:00)


追記:

> for (it = data.begin(); it != data.end(); it++);

上の式では、処理を抜けてきた時点で it の内容は end と同じに
なってませんか?



No.2591

Re:mapで一番最後の要素を取得する方法
投稿者---monkey(2004/08/30 15:10:29)


    // デクリメント演算子
    std::map< unsigned int, unsigned int >::iterator it = data.end();
    --it;
    std::cout << it->first << ", " << it->second << std::endl;

    // std::advance関数(<iterator>ヘッダをインクルード)
    it = data.end();
    std::advance( it, -1 );
    std::cout << it->first << ", " << it->second << std::endl;

    // reverse_iterator, rbegin
    std::map< unsigned int, unsigned int >::reverse_iterator rit = data.rbegin();
    std::cout << rit->first << ", " << rit->second << std::endl;
他にもあるかも。


No.2592

Re:mapで一番最後の要素を取得する方法
投稿者---愛子(2004/08/30 15:29:28)


Banさん、monkeyさん ありがとうございます。
本当に色々な方法があるのですね。

map::rbeginも調べていて使おうと思ったのですが、出来ずに悩んでいました。
原因は、::reverse_iterator にしていなかった為でした。
(::iteratorにしていた^_^;)

お二人のお蔭で、
std::map< unsigned int, unsigned int >::reverse_iterator rit = data.rbegin();
で解決しました。
ありがとうございました。とっても勉強になりました。