2014-08-31 5 views
-2

В следующем коде для обеспечения безопасности я хочу свернуть указатель перед возвратом сохраненного им адреса. Как я могу это сделать?Уточнить указатель перед возвратом адреса

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; 
    } 
} 
+6

Это выглядит ужасно. Если вы опишете, что вы хотите сделать, возможно, вы можете получить несколько советов, как написать лучшую функцию. – nvoigt

+0

Моя цель - вернуть адрес целого числа, выбранного по определенному условию. Я возвращаюсь по ссылке, потому что мне нужно использовать точно такое же целое число позже, а не его копию. – Shibli

+1

Это пахнет плохим дизайном. Зачем вам нужен адрес того, что хранится в векторе? – nvoigt

ответ

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) -размер.

Смежные вопросы