如何通过引用隐式地期望空向量作为输入返回向量?

时间:2016-07-12 07:46:29

标签: c++ function opencv vector reference

假设我有一个点向量,并希望在一个函数调用中将它分成另外两个向量。我怎样才能最好地返回这些向量。 我目前的方法是通过引用将所需的输出向量提供给函数。

void separatePoints(const vector<Point> &P, vector<Point> &P_1, vector<Point> &P_2)
{    
   for (size_t i = 0; i < P.size(); P++)
   {
     if (P[i].x < 100 && P[i].y < 100)
       P_1.push_back(P[i]);
     else 
       P_2.push_back(P[i]);
   }
}

vector<Point> P;
//.... this vector should be filled and contain some points
vector<Point> P_1, P_2; //not initialised
separatePoints(P, P_1, P_2);

当我执行上述操作时,如果输出向量P_1P_2为空,则它可以正常工作并且符合预期,否则将将点附加到向量。如果需要,那就没关系,但是如果不需要该怎么办?

当然,我可以在函数调用中创建两个新向量,并将这些向量分配给函数末尾的P_1P_2。但这是一个很好的方法,还是有一些我现在想念的更好的方法呢?

void separatePoints(const vector<Point> &P, vector<Point> &P_1, vector<Point> &P_2)
{
   vector<Point> P_1_temp, P_2_temp;
   for (size_t i = 0; i < P.size(); P++)
   {
     if (P[i].x < 100 && P[i].y < 100)
       P_1_temp.push_back(P[i]);
     else 
       P_2_temp.push_back(P[i]);
   }
   P_1 = P_1_temp;
   P_2 = P_2_temp;
}

2 个答案:

答案 0 :(得分:1)

您可以将空矢量对象作为非const引用传递,也可以将它们作为std::pair<std::vector<>,std::vector<>>返回,或者将它们作为std::tuple返回。

std::pairhttp://www.cplusplus.com/reference/utility/pair/

std::tuplehttp://en.cppreference.com/w/cpp/utility/tuple

答案 1 :(得分:1)

如果要返回结果,我建议使用返回值而不是引用或指针参数。它使代码更容易理解:

std::pair<std::vector<Point>, std::vector<Point>> separatePoints(const std::vector<Point> &P)
{
   std::pair<std::vector<Point>, std::vector<Point>> vectors;
   for (size_t i = 0; i < P.size(); P++)
   {
       if (P.x[i] < 100 && P.y[i] < 100)
           vectors.first.push_back(P[i]);
       else 
           vectors.second.push_back(P[i]);
   }
   return vectors;
}

如果您不喜欢std::pair声明的嵌套模板语法,请定义您自己的结构

struct PointVectorPair {
    std::vector<Point> v1;
    std::vector<Point> v2;
}