创建矢量的约定

时间:2016-02-26 21:08:51

标签: c++ vector

我有一个包含vector<vector<int>> adjacencyLists;

的课程

哪个更常用于初始化矢量矢量?

1)

adjacencyLists = vector<vector<int>>(vertices, vector<int>());

2)

vector<vector<int>> adjacencyLists(vertices, vector<int>());

我个人认为第一个因为=标志而更加清晰,但我觉得人们经常使用第二个,这是真的吗?

3 个答案:

答案 0 :(得分:2)

第一个版本创建一个对象,然后将其分配给变量。

第二个只创建一个对象。因此理论上它可以更有效,但我很确定大多数编译器会在两种情况下都创建相同的代码。

答案 1 :(得分:2)

鉴于该向量是一个类成员,您最好使用初始化列表

 YourClass::YourClass(std::size_t vertices) : adjacencyList(vertices, std::vector<int>())
 {

 }

因为它直接调用vector<vector<int> >的构造函数。

做作业

 YourClass::YourClass(std::size_t vertices)
 {
     adjacencyList = vector<vector<int> >(vertices, vector<int>());
 }

实际上在功能上等同于

 YourClass::YourClass(std::size_t vertices) : adjacencyList()
 {
        adjacencyList = vector<vector<int> >(vertices, vector<int>());
 }

因为在进入YourClass::YourClass的主体之前隐式构造了所有成员和基础。 (该标准规定了多个基地和成员的建设顺序,但结果仍然相同)。

这意味着您的方法构造adjacencyList,创建临时vector<vector<int> >,并调用赋值运算符以有效地重新初始化adjacencyList。最好的情况(假设vector的构造函数和运算符得到了明智的实现,其中大多数是)这种方法没有比直接初始化更多的开销。最糟糕的情况是,因为它构造了更多临时对象而编译器可能无法优化它们,所以开销更大。

答案 2 :(得分:0)

class test
{
public:
    // The good thing about this is that it will always work
    // even if you have multiple constructors.
    vector<vector<int>> adjacencyLists { vertices };

    // Unlike this:
    test() : adjacencyLists  { vertices}
    {

    }

    test()
    {
        // This is calling the move assignment operator.
        // 1) adjacencyLists empty vector was created earlier.
        // 2) Temporary vector { vertices } is created.
        // 3) Temporary vector is moved to the adjacencyLists  vector.
        // 2 constructor calls, and 1 move assignment call.
        adjacencyLists = decltype(adjacencyLists) { vertices };

        // Using the member initializer list or
        // using a default member initializer or
        // using resize only construct a single vector.
    }

    test()
    {
        // This would be what you are looking for instead
        adjacencyLists.resize(vertices);
    }    
};