2011-11-07 3 views
3

クラス内の文字列の不要なヒープ割り当てを回避するために、私は次のようなパターン採用している:私はconst&iterator、またはiteratorだけを使うべきですか?

void GetName(const Iter &iter) const  // <----- changed to const & 
を言うとき

#include <algorithm> 
using namespace std; 

class Person 
{ 
public: 
    template<typename Iter> 
    void GetName(Iter iter) const  // Allow for caller to provide the buffer 
    { 
     const char *name = ...; // Get the name 
     size_t cchName = ...; // Get the size 
     copy(&name[0], &name[cchName], iter); 
    } 

    string GetName() const   // Convenience method 
    { 
     string name; 
     this->GetName(inserter(name, name.end())); 
     return name; 
    } 
}; 

をただし、コードも完全に正常に動作するようです

const &バージョンのイテレータを使用する理由(パフォーマンスなど)はありますか、それともIterだけを使用する必要がありますか? (私はイテレータのコンベンションや、何か意味があるかどうか分かりません)。(C++ 03)

+0

ほとんどのイテレータ・タイプは、非常に単純なインライン・コピー・コンストラクタとデストラクタを持っているため、重要な違いはありません。しかし私は、私が考えなかった要因があるかどうかを知ることに興味があります。 – aschepler

+0

@aschepler:うん。また、私が心配している引数の*コスト*だけではありません(あなたが言及したように、コンパイラはインライン展開についてかなりスマートです)、constが原因でブレークするケースがあるかどうか疑問に思っています'-ness ... – Mehrdad

答えて

2

ここでの違いは、値渡しと関数呼び出し時の参照渡しと同じ違いです。

渡すと、渡された変数のコピーが作成され、関数はそれを使用します。

参照渡しを行うとコピーされません。また、タイプをconstとして渡すことで、あるレベルの変更(それは途方もないハッカーで壊れる可能性があります)に対してそれを守ります。

あなたのコード例では、イテレータを使用して反復処理する必要があり、ちょうど、自身のコピーを作成するstd::copyにそれを渡す必要がある、だからあなたのイテレータはconstされていないので、そのためのconst参照渡し、それには関係ありませんあなたの例ではより良いオプションです。

+0

値渡しと参照渡しを理解していますが、' const'イテレータが私には分かりません約? (そうでなければ、通常のイテレータとどう違うのですか?) – Mehrdad

+2

いつもより良いとは限りません。実際、ほとんどのイテレーターでは、多くのイテレーターは単純にポインターの下にあり、参照渡しが同じバイト数/コピーであることを意味します。 –

+3

@Mehrdad: 'const ititerator'に' const_iterator'を間違えてはいけません。最初は定数データに対する可変イテレータであり、2番目は可変データに対する定数イテレータです。非常に非常に異なっています。 –

関連する問題