我有以下函数:
/* 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