我可以为向量函数返回 NULL<double> 吗?



我有以下函数:

/* 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 */

如果这是不允许的/糟糕的编码实践,我还有什么方法可以解决这个问题?

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

相关内容

  • 没有找到相关文章