在下面的代码中,为了安全起见,我想在返回它存储的地址之前使指针无效。我怎么能这样做?
int& foo (vector<int>& vec)
{
double dis = 1e6;
int* ptr = NULL;
for (int& i: vec)
{
tmp = calculate (i);
if (tmp < dis)
{
dis = tmp;
ptr = &i;
}
}
if (ptr != NULL)
{
// How to nullify the ptr?
return *ptr;
}
}
答案 0 :(得分:4)
您应该将迭代器返回到位置,而不是指针。
迭代器和指向int
的指针的有效期都是相同的。
这样你就可以通过返回vec.end()
来处理没有找到结果的情况。
vector<int>::iterator foo (vector<int>& vec)
{
double dis = 1e6;
auto result = vec.end();
auto it_end = vec.end();
for (auto it = vec.begin(); it != it_end; ++it)
{
const double tmp = calculate (*it);
if (tmp < dis)
{
dis = tmp;
result = it;
}
}
return result;
}
以防其他人提到std::min_elment
。
这不适用于此,因为foo
调用calculate
n次,而std::min_element
则称之为2 *(n-1)次。