обратная ссылка объекта от итератора
Я хочу вернуть ссылку объекта из вектора, и объект находится в объекте итератора. Как я могу это сделать?
Я попробовал следующее:
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, даже действительная ссылка может стать недействительной, когда вектор перераспределяет внутренние элементы.
Вы должны использовать только ссылочные типы возврата, когда вы всегда можете вернуть ссылку на существующий объект, который останется действительным в течение некоторого времени. В вашем случае ни один из них не гарантируется.