- 締切済み
dequeにconstが混ざったアイテムの削除
こんにちわ。 関数のパラメータに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が混ざるとリスト自体も削除できなくなってしまうのでしょうか ? もしエラーを解決できる方法をご存じの方がいらっしゃいましたら教えていただけないでしょうか。 よろしくお願いします。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- Tacosan
- ベストアンサー率23% (3656/15482)
そもそも「コンテナに入れるデータは代入可能じゃないとだめ」と規格に書いてありますな. あと, これは大きな突込みどころなんだけど「取り除きたいのは先頭や末尾だけではありませんので」というなら deque を使うべきではない.
- koko_u_
- ベストアンサー率18% (459/2509)
>上記のリストでリストのアイテム自体は削除できるようにしたいのですが、うまく行きません。 erase() は deque の途中の要素を削除する場合に内容をスライドする可能性があるので、 格納されるオブジェクトがコピー可能でなければならないのでしょう。 先頭要素または末尾の要素を取り除くだけなら pop_front() や pop_back() を利用すればよいのではないですか?
- machongola
- ベストアンサー率60% (434/720)
こんばんは。 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);
お礼
machongola さん、こんにちは。 提示して頂いた方法で期待する動作をしました。 iterator をキャストする発想はありませんでした。 これはこの質問だけではなく、他には応用が効きそうです。 自分の書くプログラムの幅が広がりそうです。 ありがとうございました。
お礼
koko_u_ さん、レスありがとうございます。 取り除きたいのは先頭や末尾だけではありませんので、 machongola さんが提示して頂いた方法が私としては回答になります。 これは私が、 > listTest.erase( listTest.begin()) ; と書いたのが koko_u_ さんに余計な誤解をさせてしまったと思います。 大変失礼しました。質問するときは端折らずにちゃんと書くように致します。