C++ 从迭代器返回对象的引用

C++ 从迭代器返回对象的引用,c++,reference,vector,null,iterator,C++,Reference,Vector,Null,Iterator,我想从向量中返回一个对象的引用,该对象位于迭代器对象中。我该怎么做 我尝试了以下方法: Customer& CustomerDB::getCustomerById (const string& id) { vector<Customer>::iterator i; for (i = customerList.begin(); i != customerList.end() && !(i->getId() == id); ++i);

我想从向量中返回一个对象的引用,该对象位于迭代器对象中。我该怎么做

我尝试了以下方法:

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
}
Customer和CustomerDB::getCustomerById(常量字符串和id){
向量::迭代器i;
对于(i=customerList.begin();i!=customerList.end()&&&!(i->getId()==id);+i);
如果(i!=customerList.end())
return*i;//是否正确?
其他的
return 0;//此处出现错误,不能将0作为引用返回
}
在代码中,customerList是客户的向量,函数getId返回客户的id


*i
正确吗?如何返回0或null作为引用?

返回*I是正确的,但是不能返回0或任何其他此类值。如果在向量中找不到客户,请考虑抛出异常。


在返回对向量中元素的引用时也要小心。如果vector需要重新分配内存并移动内容,则在vector中插入新元素可能会使引用无效。

没有“null”引用:如果您的方法获得的id不在vector中,它将无法返回任何有意义的值。正如@reko_t所指出的,当向量重新分配其内部时,即使是有效的引用也可能变得无效


只有在始终可以返回对将在一段时间内保持有效的现有对象的引用时,才应该使用引用返回类型。在您的情况下,两者都不能保证。

或者,他可以返回指针。沿着
returni!=customerList.end()&*i:空。通过一些不确定的强制转换创建空引用几乎是可能的,但这是一个非常糟糕的主意,而且很可能在几乎所有可能的情况下都是如此。是的,这在很大程度上取决于函数的预期用途。如果调用函数时最初的期望是客户应该存在,那么抛出异常是有意义的。如果其目的更多地是询问“客户是否存在,如果存在,则返回客户”,则返回可为空的类型更有意义。如果您知道向量将包含的元素的最大数量,则可以使用向量的
reserve()
函数预先保留容量。然后,只要向量的大小不超过容量,在插入新元素时元素就不会移动。如果你事先不知道容量,考虑使用另一种容器。例如,
std::deque
的行为类似于vector,但在需要调整其大小时不会重新分配其所有内存;它只会为新元素分配一个新块(因此内存是部分分段的)。还要记住,插入新元素并不是使对向量的引用无效的唯一方法,如果删除向量中间的元素,它会向下移动之后的元素,从而使对它们的引用/迭代器无效。如果您曾经这样做过,那么使用诸如
std::list
之类的容器可能更适合您。最后,保证引用/迭代器不会失效的一种方法是,不要将引用在内存中保存足够长的时间,以便插入新元素。+1用于提及有效性问题(无论函数是否返回引用、指针或迭代器,有效性都是有效的)。