またまた質問です。
以下の処理をさせるとエラーが出ます。
どなたか見ていただけますか?
環境は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 オブジェクトに指定されています。
No.2ベストアンサー
- 回答日時:
map というデータ構造は「キーに対して値を対応させる」というのが本質です. 従って 1つのキーに対しては 1つしか値がありません (multi_map では 1つのキーに対して複数の値が存在しえます) が, 同じ値を持つキーは複数存在することがあります. 「値に対して昇順にする」というのは, どのような意味で言っているのでしょうか?
そもそも map は「集合」ととらえるべきであり, その要素 (や要素の一部であるキー・値) に順序 (前後関係) が存在するというのは本質ではありません. ANSI C++ ではキーの順序関係を使ってアクセスする (だからキーとして使う型には順序を定義しなければならい) map とそのバリエーションである multi_map しかありませんが, STLport などではキーに順序を仮定しない hash_map というものもあります.
この回答への補足
>>kmb01, Tacosan
本質的ではないのは承知していました。
ですが、mapを使ってsortができたら一番楽だなあと思い、実装してしまいました。
お騒がせしました。どうもすいません。
No.3
- 回答日時:
コンパイルでエラーになるのは、mapのbegin()で返される要素のkeyがconstの為、reverseで行われるswapができない為ではないでしょうか。
mapの要素の型は、pair<const Key, Velue>です。
mapに要素を追加すると、キーの昇順でソートされて格納すると思いますが、No.2さんがお書きのように、mapでの要素の順序は本質ではないです。
本来、mapを使うべきではないところに、mapを使おうとしているのではないでしょうか。
返信おそくなってしまいました。すいません。
ご指摘の通り、確かに本質的ではありませんでした。
> コンパイルでエラーになるのは、mapのbegin()で返される要素のkeyがconstの為、reverseで行われるswapができない為ではないでしょうか。
なるほど。勉強になります。
今回の例はmapを使わずに作成することにしました。
本当にお騒がせしました。
返信してくださった皆様、ありがとうございました。
No.1
- 回答日時:
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> >ではキーに足して降順ですが、値に対して降順にしたい時とかはどうすればいいでしょうか?
お願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
[C++]継承したクラスのコンスト...
-
void func( void )について
-
C++ template operator T()
-
引数で argc argvが使用され...
-
構造体のtypedef宣言
-
警告 ”値が割り当てられていな...
-
!とキャスト
-
C言語のコンパイルエラー
-
unsigned *という宣言について
-
C++/CLIでネイティブの構造体を...
-
DWORDの実際の型は何でしょうか
-
void main (void)について、、、
-
DLLでLIBファイルが作成されない
-
ループを使用して変数に格納したい
-
C++で構造体のコピーはできても...
-
MFC C++
-
2重定義って??
-
二つ以上の値を返す関数
-
マップとアルゴリズム
-
【#define】 defineで定義した...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
DWORDの実際の型は何でしょうか
-
visualstudio C# テキストボッ...
-
C++のfor文について
-
2重定義って??
-
long型の定数の末尾にLを付ける...
-
typedef enumの使い方を教えて...
-
main.c:7:43: warning: implici...
-
C++でboolにintの値を代入する...
-
構造体の要素すべてに対する四...
-
intとINTの違いは?
-
ハンドルされていない例外が発...
-
DDVによるメッセージの変更
-
変数の型を定義しなかった場合...
-
【#define】 defineで定義した...
-
C++ クラスをメンバにもつクラ...
-
構造体の宣言でエラーが出ます。
-
プログラムの中で別のmainを呼...
-
void func( void )について
-
エラー「invalid conversion fr...
-
関数の実体定義にヘッダファイ...
おすすめ情報