2011-12-22 15 views
3

私のプログラムでは、かなりの場所でstd :: mapデータ構造にアクセスして変更する必要があります。今私はというメソッドを持っています。getMap()は基本的にstd :: mapへの参照を返します。私はより良いカプセル化とパフォーマンスのためにイテレータをマップ自体の代わりにstd :: mapに戻すことを考えています。このようなことをすることやマップを返すことは、カプセル化とパフォーマンスに関するイテレータを返すことと同じくらい良いことですか?コンテナへのアクセスが必要なときに、コンテナ自体の代わりにイテレータを返す

+2

私はOOの観点から、これは悪いデザインだと言います。マップを保持するクラスには、必要な操作を実行できるメソッドがある方がよいでしょう。 – LiMuBei

+0

そのようなイテレータを返すことは、あなたに何の役にも立たないでしょう。イテレータをどのように受け取るかを前もって考えてください: std :: map :: iterator it = getMapIterator(); 既にマップを再宣言していることに注意してください(構文上)。あなたがタイピングをしないようにしようとしているなら、それはそれについて行く方法ではありません。もちろん、宣言をtypedefすることができますが、それはちょっと混乱を招くだけです。異なるイテレータを保持するアプリのさまざまな部分では、物事が本当に乱雑になります。 イテレータを返すのではなく、マップへの参照を固執することを検討してください。 – Kaa

答えて

0

mapへの参照が必要な場合は、イテレータを返すのはなぜですか?

マップの特定の部分を指し示す必要がある場合、イテレータは必ずしもそのウェルをカプセル化しません(const?reverse?random access ..?あなたの呼び出しルーチンは、裸のイテレータはその保護を提供しません)。 boost::rangeがより良い解決策を提供するかもしれません。

他のいくつかのコンテナ(ベクターなど)では、使用前に別のルーチンがコンテナを変更すると、イテレータは無効になります。プログラムのセマンティクスに応じて、これがカプセル化を破ると考えるかもしれません。

+0

マップには、新しい要素をマップに挿入しても既存の要素を指すイテレータは無効にならないという重要な特性があります。マップから要素を消去しても、消去される要素を実際に指すイテレータ以外のイテレータは無効になりません。 – polapts

+0

おっと、私の悪いです。編集されました。 –

0

マップ全体のイテレータを返すときに関数の有用性を減らすと思います。この関数のコンシューマは、単にイテレータを取得するために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で)別のコレクションクラスに要素を追加画面に出力し、あるいはどこにでもそれらを保存せずに要素を処理することができコレクション内のアイテムに関する統計を計算する。

+0

私は本当に答えをここに従わない。イテレータを返すことは悪い考えですか?しかし、OutputIteratorを受け入れる関数は大丈夫です。私は何かが欠けているかもしれません。また、generate()アルゴリズムについても触れましたが、この例ではcopy()です。 – polapts

+0

@PavanTotala "generate"はタイプミスですが、修正します。私の主張は、イテレータをマップ全体に返すことは役に立たず、ユーザはmyMap()。begin()でそれを行うことができます。 2番目の段落では、コレクションの一部のサブセットが返されることを指摘しました。フィルタリングされたサブセットまたは範囲を返すイテレータは非常に柔軟な方法です。私は編集します。 –

+0

@PavanTotala:私はそれを書いたとき私は眠っていたに違いない。私はそれを大幅に編集しました。それが明確であれば教えてください。 –

0

私は過去に同じことをしましたが、現在はコレクション全体への参照を返すことを好みます。私はイテレータが有効であることを心配しています。たとえば、イテレータを使用してエントリを削除しても、それでも有効な場合、またはそれらを再度取得する必要はありますか?コレクションを返すことはもっと露出するように感じますが、私はそれがより安全だと感じています。

関連する問題