【お題】王手、そして

またまた質問です。
以下の処理をさせるとエラーが出ます。
どなたか見ていただけますか?

環境はWindows XP, Visual Studio.NETです。

-----処理部分------------------
map<char, int> m;
for(i=0; i<10; i++){
 m.insert(pair<char, int>('A'+i, i));
}
reverse(m.begin(), m.end());

map<char, int>::iterator p;
p = m.begin();

while( p != m.end() ){
 cout << p->first << " " << p->second << endl;
 p++;
}

------以下エラーログ---------------
C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\utility(16) : error C2166: 左辺値は const オブジェクトに指定されています。
C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\utility(46) : コンパイルされたクラスのテンプレートのインスタンス化 'void std::swap<const _Ty1>(const _Ty &,const _Ty &)' の参照を確認してください
with
[
_Ty1=int,
_Ty=int
]
C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\utility(45): クラス テンプレートのメンバ関数 'void std::pair<_Ty1,_Ty2>::swap(std::pair<_Ty1,_Ty2>::_Myt &)' のコンパイル中
with
[
_Ty1=const int,
_Ty2=int
]
ClusteringMain.cpp(45) : コンパイルされたクラスのテンプレートのインスタンス化 'std::pair<_Ty1,_Ty2>' の参照を確認してください
with
[
_Ty1=const int,
_Ty2=int
]
C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\utility(16) : error C2166: 左辺値は const オブジェクトに指定されています。

A 回答 (3件)

map というデータ構造は「キーに対して値を対応させる」というのが本質です. 従って 1つのキーに対しては 1つしか値がありません (multi_map では 1つのキーに対して複数の値が存在しえます) が, 同じ値を持つキーは複数存在することがあります. 「値に対して昇順にする」というのは, どのような意味で言っているのでしょうか?



そもそも map は「集合」ととらえるべきであり, その要素 (や要素の一部であるキー・値) に順序 (前後関係) が存在するというのは本質ではありません. ANSI C++ ではキーの順序関係を使ってアクセスする (だからキーとして使う型には順序を定義しなければならい) map とそのバリエーションである multi_map しかありませんが, STLport などではキーに順序を仮定しない hash_map というものもあります.

この回答への補足

>>kmb01, Tacosan

本質的ではないのは承知していました。
ですが、mapを使ってsortができたら一番楽だなあと思い、実装してしまいました。

お騒がせしました。どうもすいません。

補足日時:2004/12/02 20:23
    • good
    • 0

コンパイルでエラーになるのは、mapのbegin()で返される要素のkeyがconstの為、reverseで行われるswapができない為ではないでしょうか。


mapの要素の型は、pair<const Key, Velue>です。

mapに要素を追加すると、キーの昇順でソートされて格納すると思いますが、No.2さんがお書きのように、mapでの要素の順序は本質ではないです。

本来、mapを使うべきではないところに、mapを使おうとしているのではないでしょうか。
    • good
    • 0
この回答へのお礼

返信おそくなってしまいました。すいません。

ご指摘の通り、確かに本質的ではありませんでした。

> コンパイルでエラーになるのは、mapのbegin()で返される要素のkeyがconstの為、reverseで行われるswapができない為ではないでしょうか。

なるほど。勉強になります。

今回の例はmapを使わずに作成することにしました。
本当にお騒がせしました。

返信してくださった皆様、ありがとうございました。

お礼日時:2004/12/08 18:12

mapはreverseできないということでしょう。



そもそもmapをreverseするとはどういうことを望んでいるのでしょうか。
キーに対して降順に並んだmapを得たいなら、

map<char, int, greater<char> > m1;
for (p=m.begin(); p!=m.end(); p++) {
m1.insert(*p);
}

のように別のmapにコピーすれば出来ますが、意味がありません。
降順mapが欲しいなら最初からmap<char, int, greater<char> > を作ればいいし、
昇順マップでもreverse_iteratorを使うなりキーを評価するなりすればいいと思います。

この回答への補足

返信ありがとうございます。

聞き方が悪かったかもしれません、すいません。
本当はreverseさせたいわけではなく、
vector等のようにmapにも共通アルゴリズム(reverseやsort, etc)を使いたかったのですが、そのやり方がわからず質問をしました。例えばmap<char, int, greater<char> >ではキーに足して降順ですが、値に対して降順にしたい時とかはどうすればいいでしょうか?

お願いします。

補足日時:2004/12/02 10:46
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報