電子書籍の厳選無料作品が豊富!

こんにちわ。

関数のパラメータにpairのdequeを渡したときにfirstを変えてほしくないために
以下のようにプログラムを書きました。ただしdequeの中身自体は削除したいのですが、
エラーになってしまいます。

deque< pair< const int, int > > listTest ;
pair< int, int > pairTest ;

pairTest.first = 0 ; pairTest.second = 4 ; listTest.push_back( pairTest ) ;
pairTest.first = 1 ; pairTest.second = 5 ; listTest.push_back( pairTest ) ;
pairTest.first = 2 ; pairTest.second = 6 ; listTest.push_back( pairTest ) ;
pairTest.first = 3 ; pairTest.second = 7 ; listTest.push_back( pairTest ) ;

// ↓ エラー(こちらは自分の期待通り)。
listTest.begin()->first = 10 ;

// secondは変更できる(こちらも自分の期待通り)。
listTest.begin()->second = 20 ;

// ↓ エラー。
listTest.erase( listTest.begin()) ;

上記のリストでリストのアイテム自体は削除できるようにしたいのですが、うまく行きません。
テンプレート引数にconstが混ざるとリスト自体も削除できなくなってしまうのでしょうか ?
もしエラーを解決できる方法をご存じの方がいらっしゃいましたら教えていただけないでしょうか。
よろしくお願いします。

A 回答 (3件)

そもそも「コンテナに入れるデータは代入可能じゃないとだめ」と規格に書いてありますな.


あと, これは大きな突込みどころなんだけど「取り除きたいのは先頭や末尾だけではありませんので」というなら deque を使うべきではない.
    • good
    • 0

>上記のリストでリストのアイテム自体は削除できるようにしたいのですが、うまく行きません。



erase() は deque の途中の要素を削除する場合に内容をスライドする可能性があるので、
格納されるオブジェクトがコピー可能でなければならないのでしょう。

先頭要素または末尾の要素を取り除くだけなら pop_front() や pop_back() を利用すればよいのではないですか?
    • good
    • 0
この回答へのお礼

koko_u_ さん、レスありがとうございます。

取り除きたいのは先頭や末尾だけではありませんので、
machongola さんが提示して頂いた方法が私としては回答になります。

これは私が、

> listTest.erase( listTest.begin()) ;

と書いたのが koko_u_ さんに余計な誤解をさせてしまったと思います。
大変失礼しました。質問するときは端折らずにちゃんと書くように致します。

お礼日時:2008/10/24 10:35

 こんばんは。


 deque< pair< int, int > >の参照に変換すれば通ります。

typedef deque< pair< const int, int > > const_type;
typedef deque< pair< int, int > > unconst_type;

//unconst_type::iterator&に変換してから複写
unconst_type::iterator it = (unconst_type::iterator&)(listTest.begin());

// ↓ 消せる。
((unconst_type&)listTest).erase(it) ;

// 確認してみる
for(const_type::iterator it2 = listTest.begin(); it2 != listTest.end(); ++it2)
printf("%d %d\n", it2->first, it2->second);
    • good
    • 0
この回答へのお礼

machongola さん、こんにちは。

提示して頂いた方法で期待する動作をしました。

iterator をキャストする発想はありませんでした。
これはこの質問だけではなく、他には応用が効きそうです。
自分の書くプログラムの幅が広がりそうです。

ありがとうございました。

お礼日時:2008/10/24 10:43

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