2014-08-31 55 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 2014-08-31 13:24:03

+0

我的目標是根據某些條件返回所選整數的地址。我通過引用返回,因爲我需要使用完全相同的整數,而不是它的副本。 – Shibli 2014-08-31 13:28:20

+1

聞起來很糟糕的設計。爲什麼你需要將地址存儲在向量中? – nvoigt 2014-08-31 13:31:10

回答

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)次。