2017-06-14 93 views
1

我有以下功能:我可以爲矢量<double>函數返回NULL嗎?

/* Calculate if there is an intersection with given intial position and 
    direction */ 
vector<double> intersection(vector<double> startPos, vector<double> direction) 
{ 
    if(there is intersection) 
     return (intersection coordinates); 
    else { 
     return NULL; 
    } 
} 

我能做到這一點,並覈對NULL如果存在交集:

vector<double> v = intersection(pos, dir); 
if(v == NULL) 
    /* Do something */ 
else 
    /* Do something else */ 

如果這是不允許的/壞的編碼習慣,什麼法子我可能會這樣做?

+10

一個向量不可能是NULL,但它可以是empty()。 –

+0

也許看到這個問題:https://stackoverflow.com/q/29460651/10077 –

+1

第NULL號通常與指針一起使用。然而,你可以返回一個空矢量,並在另一側驗證它是否爲空。 – Rosme

回答

3

NULL真的只是指針的概念。既然我們有一個容器,我們可以檢查其他的東西,也就是容器是否爲empty。如果是的話,我們知道我們沒有內容,如果不是,那麼我們知道有東西需要處理。可以讓你寫的代碼像

vector<double> intersection(vector<double> startPos, vector<double> direction) 
{ 
    if(there is intersection) 
     return (intersection coordinates); 
    else { 
     return {}; // this means return a default constructed instance 
    } 
} 

,然後你可以使用它像

vector<double> v = intersection(pos, dir); 
if(v.empty()) 
    /* Do something */ 
else 
    /* Do something else */ 

還要注意的是,如果你想獲得一個交集,您可以使用std::set_intersection和使用它像

#include <iostream> 
#include <vector> 
#include <algorithm> 
#include <iterator> 
int main() 
{ 
    std::vector<int> v1{1,2,3,4,5,6,7,8}; 
    std::vector<int> v2{  5, 7, 9,10}; 
    std::sort(v1.begin(), v1.end()); 
    std::sort(v2.begin(), v2.end());  
    std::vector<int> v_intersection;  
    std::set_intersection(v1.begin(), v1.end(), 
          v2.begin(), v2.end(), 
          std::back_inserter(v_intersection)); 
    for(int n : v_intersection) 
     std::cout << n << ' '; 
} 

輸出:

5 7