所以,我有这个问题。我有两个对象,我需要比较每个对象中的数据,问题是,当我调用一个函数时,我必须同时发送它们,但是我的老师要我制作它,这样我才能向它发送任何对象, 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
)的传递,可以在函数对变量进行修改时更容易从调用站点发现该变量。