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