定义生成元素C++向量的函数时,正确的方法是什么

Pro*_*oGM 3 c++ vector instance parameter-passing pass-by-reference

我必须在C++中定义一个函数,它生成一个类Foo的向量并返回它.

我可以用不同的方式定义它,它们都是完全相同的:

C样式参数传递:

void generateFooVector(vector<Foo> * result)
{
    for (int i = 0; i < 100; i++)
    {
        Foo f = Foo();
        result->push_back(f);
    }
}
int main()
{

    vector<Foo> result;
    generateFooVector(&result);
}
Run Code Online (Sandbox Code Playgroud)

参考传球:

void generateFooVector(vector<Foo> & result)
{
    for (int i = 0; i < 100; i++)
    {
        Foo f = Foo();
        result->push_back(f);
    }
}
int main()
{
    vector<Foo> result;
    generateFooVector(result);
}
Run Code Online (Sandbox Code Playgroud)

实例化向量并返回指针:

vector<Foo> * generateFooVector()
{
    vector<Foo> * result = new vector<Foo>();
    for (int i = 0; i < 100; i++)
    {
        Foo f = Foo();
        result->push_back(f);
    }
    return result;
}
int main()
{
    vector<Foo> * result = generateFooVector();
}
Run Code Online (Sandbox Code Playgroud)

C风格传递和实例化Foo类:

void generateFooVector(vector<Foo *> * result)
{
    for (int i = 0; i < 100; i++)
    {
        Foo * f = new Foo();
        result->push_back(f);
    }
}
int main()
{
    vector<Foo *> result;
    generateFooVector(&result);
}
Run Code Online (Sandbox Code Playgroud)

引用传递+ Foo实例:

void generateFooVector(vector<Foo *> & result)
{
    for (int i = 0; i < 100; i++)
    {
        Foo * f = new Foo();
        result->push_back(f);
    }
}
int main()
{

    vector<Foo *> result;
    generateFooVector(result);
}
Run Code Online (Sandbox Code Playgroud)

矢量实例+ Foo实例:

vector<Foo*> * generateFooVector()
{
    vector<Foo*> * result = new vector<Foo*>();
    for (int i = 0; i < 100; i++)
    {
        Foo * f = new Foo();
        result->push_back(f);
    }
    return result;
}
int main()
{

    vector<Foo *> * result = generateFooVector();
}
Run Code Online (Sandbox Code Playgroud)

价值传递:

vector<Foo> generateFooVector()
{
    vector<Foo> result;
    for (int i = 0; i < 100; i++)
    {
        Foo f = Foo();
        result->push_back(f);
    }
    return result;
}
int main()
{

    vector<Foo > result = generateFooVector();
}
Run Code Online (Sandbox Code Playgroud)

也许还有很多其他解决方案.

在范围内,所有当前方式对内存的分配方式都有不同的含义.

也许我缺乏理论,但我真的很困惑,我怎么能决定哪个是每个用例的更好的选择,以及为什么一个比另一个好.你能帮助我吗?

bil*_*llz 8

做就是了

vector<Foo> generateFooVector()
{
    return vector<Foo>(100);
}
Run Code Online (Sandbox Code Playgroud)

它被称为modern c++.

  • 有问题长度比的最佳答案长度. (4认同)

Tem*_*Rex 5

该函数已在标准库中定义,称为构造函数std::vector<Foo>.你可以称之为(C++ 11风格)

auto v = std::vector<Foo>(n); // create n default constructed Foo() objects
Run Code Online (Sandbox Code Playgroud)

或者用C++ 98样式(在C++ 11中也有效)

std::vector<Foo> v(n); 
Run Code Online (Sandbox Code Playgroud)

我不会尝试包装这个.

  • 首先,您不希望在其中隐藏像100这样的幻数,而不是在参数列表(模板或运行时)中隐藏.
  • 不包装构造函数的另一个原因是为了避免代表读者混淆.如果我遇到一个generateVector函数,第一个问题是:"与普通的构造函数调用相比,这个函数是做其他什么/额外的吗?"