假设我有一个点向量,并希望在一次函数调用中将其分成另外两个向量。我将如何最好地返回这些向量。我目前的方法是通过引用为函数提供两个所需的输出向量。
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_1
并且P_2
为空,则它可以很好地工作,并且符合预期,否则点将附加到向量中。如果需要这样做,那也可以,但是如果不需要该怎么办?
当然,我可以在函数调用中创建两个新向量,并将这些向量分配给函数末尾的P_1
和P_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;
}
如果要返回结果,我建议使用返回值而不是引用或指针参数。它使代码更易于理解:
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;
}
您可以将空向量对象作为非常量引用传递,或者将它们作为std::pair<std::vector<>,std::vector<>>
返回,或者将它们作为std::tuple
返回。
std::pair
: http://www.cplusplus.com/reference/utility/pair/
std::tuple
: http://en.cppreference.com/w/cpp/utility/tuple