1

所以,我有这个问题。我有两个对象,我需要比较每个对象中的数据,问题是,当我调用一个函数时,我必须同时发送它们,但是我的老师要我制作它,以便我可以发送任何对象给它,并且向量将被更新,而不是重新创建。当前功能:

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

如您所见,我发送了两个对象,将它们放入循环中,得到我想要的,然后将向量发回。尽管我需要的是通用的,就像我发送一个对象一样,当前向量会更新,然后返回,冲洗并重复..我该怎么做?

4

1 回答 1

1

您的代码几乎是惯用的 C++11 风格,只要您将其更改为传递大类型,例如A,BRconst&

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

根据一些风格指南(例如谷歌),变量地址的传递(&someX在这种情况下)使得在函数修改变量时更容易从调用站点发现。

于 2014-03-05T15:35:37.597 回答