Должен ли я использовать const & iterator или просто итератор? - PullRequest
3 голосов
/ 07 ноября 2011

Чтобы избежать ненужного выделения куч в строках внутри класса, я принял шаблон, подобный следующему:

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

Однако код, кажется, также работает отлично, когда я говорю1004 *

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

Есть ли какая-либо причина (производительность или иное) для меня, чтобы использовать const & версию итератора, или я должен просто использовать Iter сам?(Я не знаю соглашения для итераторов или есть ли какие-либо последствия.) (C ++ 03)

1 Ответ

2 голосов
/ 07 ноября 2011

Разница здесь такая же, как и передача по значению и передача по ссылке при вызове функций.

Когда вы передаете по значению, создается копия переданной переменной, и функция использует ее.

Когда вы передаете по ссылке, копия не сделана. Кроме того, передача типа const защищает его от модификации до некоторого уровня (конечно, хакерская атака может сломать его).

Так как в вашем примере кода вам не нужно итерировать с помощью итератора, а просто передать его в std::copy, который создает свою собственную копию, поэтому ваш итератор, являющийся const, для него не имеет значения, следовательно, передача по константной ссылке - лучший вариант в вашем примере.

...