如何在 C++ 中创建全局向量

How to create a global vector in c++

本文关键字:创建 全局 向量 C++      更新时间:2023-10-16

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

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

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

你的代码几乎是惯用的C++11风格,如果你只是改变它来传递大型类型,如ABR 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 样式的"out-parameters",如下所示:

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)使得当变量被函数修改时更容易从调用站点发现。