2011-11-07 38 views
3

爲了避免在類中的字符串不必要的堆分配,我所採用類似於以下的模式:我應該使用const&iterator還是隻使用迭代器?

#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; 
    } 
}; 

但是,代碼也似乎完全正常工作,當我說

void GetName(const Iter &iter) const  // <----- changed to const & 

是否有任何理由(性能或其他)使用const &版本的迭代器,或者我應該使用Iter本身? (我不知道迭代器的約定,或者是否有任何影響。)(C++ 03)

+0

大多數迭代器類型都有非常簡單的內聯複製構造函數和析構函數,所以它不太可能產生重要的區別。但我有興趣看看是否有任何我沒有想到的因素。 – aschepler

+0

@aschepler:是的。另外,這不僅僅是我擔心的參數傳遞的成本*(編譯器對於內聯非常聰明,就像你提到的那樣),而且還想知道是否有任何情況可能會破壞,因爲const ' - ... – Mehrdad

回答

2

這裏的區別與調用函數時傳遞值和傳遞引用相同。

當您通過值傳遞傳遞變量的副本被創建,並且該函數使用它。

當您通過引用傳遞時,不會進行復制。另外,傳遞類型爲const可以防止修改某個級別(當然hackery可以打破它)。

因爲在你的代碼示例,你不需要使用迭代器遍歷並只需將它傳遞給std::copy它創建自己的副本,所以你的迭代器是一個const不要緊吧,因此,通過const引用傳遞在你的例子中是更好的選擇。

+0

那麼,我明白通過值傳遞與傳遞引用,但是有什麼語義問題,什麼'const'迭代器可以/應該/不應該做,我不知道關於? (否則,它與常規迭代器有什麼不同?) – Mehrdad

+2

它並不總是更好。實際上,對於大多數迭代器來說,它是_slower_,因爲許多迭代器只是下面的指針,這意味着通過引用傳遞的是相同數量的字節/拷貝,除了它還需要指針解引用。 –

+3

@Mehrdad:不要把'const_iterator'誤認爲'const iterator'。第一個是可變數據常量迭代器,第二個是可變數據常量迭代器。非常不同。 –

相關問題