私のプログラムでは、かなりの場所でstd :: mapデータ構造にアクセスして変更する必要があります。今私はというメソッドを持っています。getMap()は基本的にstd :: mapへの参照を返します。私はより良いカプセル化とパフォーマンスのためにイテレータをマップ自体の代わりにstd :: mapに戻すことを考えています。このようなことをすることやマップを返すことは、カプセル化とパフォーマンスに関するイテレータを返すことと同じくらい良いことですか?コンテナへのアクセスが必要なときに、コンテナ自体の代わりにイテレータを返す
答えて
map
への参照が必要な場合は、イテレータを返すのはなぜですか?
マップの特定の部分を指し示す必要がある場合、イテレータは必ずしもそのウェルをカプセル化しません(const?reverse?random access ..?あなたの呼び出しルーチンは、裸のイテレータはその保護を提供しません)。 boost::range
がより良い解決策を提供するかもしれません。
他のいくつかのコンテナ(ベクターなど)では、使用前に別のルーチンがコンテナを変更すると、イテレータは無効になります。プログラムのセマンティクスに応じて、これがカプセル化を破ると考えるかもしれません。
マップには、新しい要素をマップに挿入しても既存の要素を指すイテレータは無効にならないという重要な特性があります。マップから要素を消去しても、消去される要素を実際に指すイテレータ以外のイテレータは無効になりません。 – polapts
おっと、私の悪いです。編集されました。 –
マップ全体のイテレータを返すときに関数の有用性を減らすと思います。この関数のコンシューマは、単にイテレータを取得するためにgetMap()。begin()を書くことができます。一方、要素には全く関心がないかもしれませんが、彼らはclear()
またはswap()
としたいかもしれません。コレクションの一部サブセットは例えば、出力されているが
、範囲またはいくつかの要素が述語によって選択され、出力イテレータを介してデータを返すと、が返され、コレクションが返されます。
標準ライブラリではこれが常に行われます。 copy()
アルゴリズム:ここ
template<class InputIterator, class OutputIterator>
OutputIterator copy (InputIterator first, InputIterator last, OutputIterator result)
{
while (first!=last) *result++ = *first++;
return result;
}
result
は、例えば、(back_inserter
で)別のコレクションクラスに要素を追加画面に出力し、あるいはどこにでもそれらを保存せずに要素を処理することができコレクション内のアイテムに関する統計を計算する。
私は本当に答えをここに従わない。イテレータを返すことは悪い考えですか?しかし、OutputIteratorを受け入れる関数は大丈夫です。私は何かが欠けているかもしれません。また、generate()アルゴリズムについても触れましたが、この例ではcopy()です。 – polapts
@PavanTotala "generate"はタイプミスですが、修正します。私の主張は、イテレータをマップ全体に返すことは役に立たず、ユーザはmyMap()。begin()でそれを行うことができます。 2番目の段落では、コレクションの一部のサブセットが返されることを指摘しました。フィルタリングされたサブセットまたは範囲を返すイテレータは非常に柔軟な方法です。私は編集します。 –
@PavanTotala:私はそれを書いたとき私は眠っていたに違いない。私はそれを大幅に編集しました。それが明確であれば教えてください。 –
私は過去に同じことをしましたが、現在はコレクション全体への参照を返すことを好みます。私はイテレータが有効であることを心配しています。たとえば、イテレータを使用してエントリを削除しても、それでも有効な場合、またはそれらを再度取得する必要はありますか?コレクションを返すことはもっと露出するように感じますが、私はそれがより安全だと感じています。
- 1. コンテナがない場合のイテレータとして返すものは?
- 2. C++コンテナのイテレータ
- 3. リニアストレージを持つコンテナのSTLアルゴリズムでイテレータの代わりにローポインタを使用できますか?
- 4. STLコンテナにイテレータのインデックスを検索する - 必要性のテンプレート関数
- 5. jQueryのアヤックス自体への投稿の代わりに、スクリプト
- 6. コンテナがC++に必要です
- 7. コンテナに必要なもの(DIALコンテナ)はDIコンテナでどのように認識されていますか?
- 8. コンテナ内にイテレータを格納する
- 9. イテレータを返すことによってSTLコンテナの実装を隠す
- 10. イテレータと循環参照のC++コンテナ
- 11. 入れ子になったコンテナのイテレータをtypedefするには?
- 12. コンテナ内の領域の代わりにページ全体をカバーするdivを許可する
- 13. コンテナ内の絶対的な位置付けがコンテナを相対的にする必要がある理由
- 14. Dockerコンテナ内のディレクトリを別のコンテナからアクセスできるようにする
- 15. 私はなぜiocコンテナが必要なのですか
- 16. ブートストラップ3のコンテナ流体とコンテナを持つグリッド
- 17. オーバーフローテキストはコンテナのサイズを動的に変更する必要があります
- 18. コンテナ内のWebアプリケーション自体が停止する
- 19. イテレータを使用してコンテナ要素を消去する
- 20. コンテナのイテレータは左辺値以外の値を返すことができますか?
- 21. イテレータを無効にせずに要素を挿入できる標準コンテナはありますか?
- 22. dom/css:コンテナに複数の100%コンテナをコンテナに入れてビューポート(100%)より大きくする
- 23. アクセスMDBの代わりに?
- 24. コンテナ内に長いテキストをラップする必要があります
- 25. EJBコンテナとWebコンテナのJPA
- 26. アンスタックの代わりに必要なもの
- 27. 一時的なコンテナでスワップした後にイテレータが無効になる
- 28. jQueryツールギャラリーとサムネイルフェードの代わりにスライドする必要があります
- 29. VMからdockerコンテナ内のpostgresqlにアクセスできない
- 30. スタティックセルの代わりにカスタムテーブルビューセルをプロトタイプセルにする必要がありますか?
私はOOの観点から、これは悪いデザインだと言います。マップを保持するクラスには、必要な操作を実行できるメソッドがある方がよいでしょう。 – LiMuBei
そのようなイテレータを返すことは、あなたに何の役にも立たないでしょう。イテレータをどのように受け取るかを前もって考えてください: std :: map :: iterator it = getMapIterator(); 既にマップを再宣言していることに注意してください(構文上)。あなたがタイピングをしないようにしようとしているなら、それはそれについて行く方法ではありません。もちろん、宣言をtypedefすることができますが、それはちょっと混乱を招くだけです。異なるイテレータを保持するアプリのさまざまな部分では、物事が本当に乱雑になります。 イテレータを返すのではなく、マップへの参照を固執することを検討してください。 –
Kaa