おいふぉりーのぶろぐ

きっと趣味のブログに違いないです!!

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
  1. --/--/--(--) --:--:--|
  2. スポンサー広告

const_iterator の const を外したいと思ったこと

iterator_cast.png
ちょっとプログラムを書いてて思ったことです。上の図にまとめてみたのですが… const_iterator を iterator にキャストしたいなぁと思いました。

とある std::list コンテナに色々要素が入っています。とある条件でコンテナ内にある要素を消去する問題を考えます。(この条件とは、1つ要素にだけ注目してその要素を消去するかどうかは判定できず、他の要素も調べて消去するかどうか決定する必要があります。このため、単純にファンクタを用意して、それを STL のアルゴリズムで適応するというわけにはいきません。)

ここで、消去調査オブジェクトとして、コンテナの参照を渡して、消去要素の iterator を返すオブジェクトを用意しました。調査オブジェクトは要素の値を変更する必要はないので、参照に const を付けようとします。すると、自動的に返す iterator も const_iterator となります。でも、消去に使う erase() メソッドは const_iterator ではなく iterator が必要です。

そんなわけで、キャストできればなぁ~とちょっと思ったわけです。う~ん、他にいい方法はないかなぁ~。
  1. 2007/07/04(水) 01:26:53|
  2. ソフトウェア開発
  3. | トラックバック:0
  4. | コメント:3
<<MAX II CPLDボード発見 | ホーム | back_inserter にちょっと悩む>>

コメント

調査オブジェクトを使うとconst list<T>からiteratorが取り出せてしまうことになるけど、いいのかな? たしかにlist<T>オブジェクトを変化させてはいないけど、変化させられる状態にしてしまうってことだよね。。。 それを問題無いとするなら、調査オブジェクト内部でconst_castしちゃえばいいんじゃないですか?
  1. 2007/07/15(日) 12:15:52 |
  2. URL |
  3. mw #mQop/nM.
  4. [ 編集]

発想が逆では?

発想が逆ではないでしょうか。

const コンテナを検索した結果は書き換え不能のため、const_iterator を返し、非 const コンテナを検索した結果は書き換え可能なので iterator を返す。これら 2 パターンのオブジェクトを定義すれば万事解決では?

検索結果に const が要るか要らないかは後の操作に依存するため、検索自体に非 const が不要という前提から設計を進めるのは、議論が逆方向に流れている気がします。

たとえばアクセサだって、const メソッドではメンバの const 参照を返して、非 const メソッドではメンバの非 const 参照返したりしますよね。それと同じ問題だと思います。

後はコードの重複をどう回避するかが懸案ですが、const 版と非 const 版とで、相違点が型のみであればクラステンプレートを使えば良い気がします。

と、思いました。
  1. 2007/07/21(土) 13:10:19 |
  2. URL |
  3. Chiharu #-
  4. [ 編集]

RE:発想が逆では?

確かにそうなのですが・・・

検索オブジェクトがコンテナの値を変更できることが、ちょっと嫌だなぁと思いました。

iterator をラップして参照先を変更できないようにしたイテレータを作って、それを検索オブジェクトに渡そうかとも思ったのですが、なかなかスマートな実装にならないないと。
  1. 2007/08/14(火) 17:04:41 |
  2. URL |
  3. Euphorie #-
  4. [ 編集]

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバックURLはこちら
http://tm86eublog.blog42.fc2.com/tb.php/202-0b46d592
この記事にトラックバックする(FC2ブログユーザー)

来客数

プロフィール

Euphorie

Author:Euphorie
"おいふぉりー"って呼んでくださいな☆
ハードウェアとかソフトウェアとかの開発に興味があったり。。。
連絡先は上の画像。

最近の記事

最近のコメント

最近のトラックバック

月別アーカイブ

カテゴリー

ブロとも申請フォーム

この人とブロともになる

ブログ内検索

RSSフィード

リンク

このブログをリンクに追加する

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。