обратная ссылка объекта от итератора

Я хочу вернуть ссылку объекта из вектора, и объект находится в объекте итератора. Как я могу это сделать?

Я попробовал следующее:

Customer& CustomerDB::getCustomerById (const string& id) {
    vector<Customer>::iterator i;
    for (i = customerList.begin(); i != customerList.end() && !(i->getId() == id); ++i);

    if (i != customerList.end())
        return *i; // is this correct?
    else
        return 0; // getting error here, cant return 0 as reference they say
}

В коде customerList является вектором клиентов, а функция getId возвращает идентификатор клиента.

Является ли *i правильно? И как я могу вернуть 0 или null в качестве ссылки?

Ответ 1

return *i; является правильным, однако вы не можете вернуть 0 или любое другое такое значение. Рассмотрите возможность исключения исключения, если Клиент не найден в векторе.

Также будьте осторожны при возврате ссылок на элементы в векторе. Вставка новых элементов в вектор может привести к аннулированию вашей ссылки, если вектору необходимо перераспределить его память и переместить содержимое.

Ответ 2

Нет такой вещи, как "нулевая" ссылка: если ваш метод получает идентификатор, который не находится в векторе, он не сможет вернуть сколько-нибудь значимое значение. И, как указывает @reko_t, даже действительная ссылка может стать недействительной, когда вектор перераспределяет внутренние элементы.

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