C++ 如何通过引用隐式地返回一个向量,以期望一个空向量作为输入?

C++ 如何通过引用隐式地返回一个向量,以期望一个空向量作为输入?,c++,function,opencv,vector,reference,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

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

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);

可以将空向量对象作为非常量引用传递,也可以将它们作为
std::pair
返回,或者作为
std::tuple
返回

std::pair


std::tuple

您可以将空向量对象作为非常量引用传递,或者将它们作为
std::pair
返回,或者作为
std::tuple
返回

std::pair


std::tuple

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

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<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;
}

怎么样
P_1.调整大小(0);P_2.调整大小(0)?您可以简单地
P_1.clear();P_2.清除()。您可以先清除它们,或在末尾移动2个局部向量。如何
P_1.调整大小(0);P_2.调整大小(0)?您可以简单地
P_1.clear();P_2.清除()。您可以先清除它们,或在最后移动两个局部向量。这不会创建向量的副本吗?就可读性而言,我同意,但就计算而言,它也是有效的吗?@Phann:你的意思是什么时候返回这对?可能不会,在这种情况下,大多数编译器都会进行返回值优化以避免复制。这不会创建向量的副本吗?就可读性而言,我同意,但就计算而言,它也是有效的吗?@Phann:你的意思是什么时候返回这对?可能不是,大多数编译器在这种情况下都会进行返回值优化,以避免复制。
struct PointVectorPair {
    std::vector<Point> v1;
    std::vector<Point> v2;
}