所以,我有这个问题。我有两个对象,我需要比较每个对象的数据,问题是,当我调用一个函数时,我必须发送它们两个,但我的老师要我这样做,这样我就可以将任何对象发送给它, 并且 vector 将得到更新,而不是重新创建。当前函数:
vector <Muziejus> atrinktiTinkamus(Bakalauras A, Bakalauras B, string R, int m)
{
vector <Muziejus> X;
for (int i = 0; i < A.imtiK(); i++){
if (A.imtiEksponata(i).imtiRusi() == R && A.imtiEksponata(i).imtiKAmz() > m){
X.push_back(A.imtiEksponata(i));
}
}
for (int i = 0; i < B.imtiK(); i++){
if (B.imtiEksponata(i).imtiRusi() == R && B.imtiEksponata(i).imtiKAmz() > m){
X.push_back(B.imtiEksponata(i));
}
}
return X;
}
如您所见,我发送了两个对象,将它们放入循环中,得到我想要的,然后将 vector 发回。尽管我需要的是,它是通用的,就像我发送一个对象,当前 vector 更新,然后返回,冲洗并重复。我该怎么做?
您的代码几乎是惯用的 C++11 风格,如果您只是将其更改为传递大型类型,例如 A
、B
和 R
由 const&
vector <Muziejus> atrinktiTinkamus(Bakalauras const& A, Bakalauras const& B, string const& R, int m)
{
vector <Muziejus> X;
// code reading from A and B, writing to X
return X; // moved, not copied in C++11
}
auto someX = atrinktiTinkamus(someA, someB, someR, someM);
你的老师似乎希望你使用像这样通过引用传递的 C++98 风格的“输出参数”:
void // no return type
atrinktiTinkamus(
Bakalauras const& A, Bakalauras const& B, string const& R, int m,
vector<Muziejus>& X // by reference
)
{
// code reading from A and B, writing to X
}
vector<Muziejus> someX;
atrinktiTinkamus(someA, someB, someR, someM, someX);
如果您不重用 someX
变量,那么 C++11 风格会更短和惯用。但是,如果您可以重用 someX
(尤其是 std::vector
的动态分配内存),那么使用 C++98 可以提高性能风格。
注意:为了完整性,甚至还有第三种风格(实际上是第二种风格的变体),它使用指针而不是引用
void // no return type
atrinktiTinkamus(
Bakalauras const& A, Bakalauras const& B, string const& R, int m,
vector<Muziejus>* X // by pointer
)
{
// code reading from A and B, writing to X
}
vector<Muziejus> someX;
atrinktiTinkamus(someA, someB, someR, someM, &someX);
根据一些风格指南(例如 Google),传递变量的地址(在本例中为 &someX
)可以更容易地从调用站点发现变量正在被修改一个函数。
我是一名优秀的程序员,十分优秀!