私のプログラムでは、かなりの場所で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. コンテナがない場合のイテレータとして返すものは?
- 3. C++コンテナのイテレータ
- 4. コンテナ内のボタン自体を繰り返します - ExtJS
- 5. リニアストレージを持つコンテナのSTLアルゴリズムでイテレータの代わりにローポインタを使用できますか?
- 6. ブートストラップ3不必要なパディングがコンテナ流体クラスの場合
- 7. docker-compose mysqlコンテナがwordpressコンテナへのアクセスを拒否する
- 8. jQueryのアヤックス自体への投稿の代わりに、スクリプト
- 9. DockerコンテナをAWSにデプロイするときに、独自のリバースプロキシも展開する必要がありますか?
- 10. STLコンテナにイテレータのインデックスを検索する - 必要性のテンプレート関数
- 11. GroupLayoutにコンストラクタのコンテナが必要
- 12. あるコンテナから別のコンテナへのサービスへのアクセス
- 13. Symfonyコントローラがコンテナにアクセスできない
- 14. コンテナからホストへのアクセス
- 15. コンテナがC++に必要です
- 16. は、コンテナがイテレータ型か
- 17. ブートストラップnavbarコンテナとコンテナ流体の混合
- 18. 構造体のコンテナからフィールドを合計する必要があります
- 19. コンテナに必要なもの(DIALコンテナ)はDIコンテナでどのように認識されていますか?
- 20. コンテナ内にイテレータを格納する
- 21. イテレータを返すことによってSTLコンテナの実装を隠す
- 22. 入れ子になったコンテナのイテレータをtypedefするには?
- 23. イテレータと循環参照のC++コンテナ
- 24. 全体のフォルダへのアクセスをブロックし、代わりにindex.phpにルーティング
- 25. 関数自体が結果を返すときにWebSocket.ReceiveAsync()にバッファが必要なのはなぜですか?
- 26. ブートストラップ:ベストプラクティス - コンテナにナビゲートする必要がありますか?
- 27. Boostrap 4コンテナ流体と同一のパディングをコンテナとする行
- 28. ホストマシンでDockerコンテナにアクセスできない
- 29. docker SimpleHTTPServerコンテナにアクセスできない
- 30. LXCコンテナ、インターネットにアクセスできない
私はOOの観点から、これは悪いデザインだと言います。マップを保持するクラスには、必要な操作を実行できるメソッドがある方がよいでしょう。 – LiMuBei
そのようなイテレータを返すことは、あなたに何の役にも立たないでしょう。イテレータをどのように受け取るかを前もって考えてください: std :: map :: iterator it = getMapIterator(); 既にマップを再宣言していることに注意してください(構文上)。あなたがタイピングをしないようにしようとしているなら、それはそれについて行く方法ではありません。もちろん、宣言をtypedefすることができますが、それはちょっと混乱を招くだけです。異なるイテレータを保持するアプリのさまざまな部分では、物事が本当に乱雑になります。 イテレータを返すのではなく、マップへの参照を固執することを検討してください。 –
Kaa