C++ 创建向量的约定

C++ 创建向量的约定,c++,vector,C++,Vector,我有一个类,它包含一个向量邻接列表 哪个更常用于初始化向量的向量 (一) adjacencyLists=vector(顶点,vector()); (二) 向量邻接列表(顶点,向量()); 我个人认为第一个符号更清晰,因为它是=符号,但我感觉人们更经常使用第二个,是真的吗?第一个版本创建一个对象,然后将其分配给一个变量 第二个只创建一个对象。因此,从理论上讲,它可能更有效,但是我非常确定大多数编译器在这两种情况下都会创建相同的代码。第一个版本创建一个对象,然后将其分配给一个变量 第二个只创建一

我有一个类,它包含一个
向量邻接列表

哪个更常用于初始化向量的向量

(一)

adjacencyLists=vector(顶点,vector());
(二)

向量邻接列表(顶点,向量());

我个人认为第一个符号更清晰,因为它是
=
符号,但我感觉人们更经常使用第二个,是真的吗?

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


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

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


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

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

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

 }
YourClass::YourClass(std::size\u t顶点):邻接列表(顶点,std::vector())
{
}
因为它直接调用
向量的构造函数

做作业

 YourClass::YourClass(std::size_t vertices)
 {
     adjacencyList = vector<vector<int> >(vertices, vector<int>());
 }
YourClass::YourClass(std::size\t顶点)
{
邻接列表=向量(顶点,向量());
}
实际上在功能上等同于

 YourClass::YourClass(std::size_t vertices) : adjacencyList()
 {
        adjacencyList = vector<vector<int> >(vertices, vector<int>());
 }
YourClass::YourClass(std::size\t顶点):adjacencyList()
{
邻接列表=向量(顶点,向量());
}
因为所有成员和基都是在进入
YourClass::YourClass
主体之前隐式构造的。(本标准规定了多个基础和构件的施工顺序,但结果仍然相同)


这意味着您的方法构造
邻接列表
,创建临时
向量
,并调用赋值运算符来有效地重新初始化
邻接列表
。最好的情况是(假设
vector
s构造函数和运算符得到了合理的实现,大多数都是这样),这种方法没有比直接初始化更大的开销。最坏的情况是,由于它正在构造更多的临时对象,并且编译器可能不会在不存在的情况下对它们进行优化,因此开销更大。

如果向量是类成员,最好使用初始化器列表

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

 }
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);
    }    
};
YourClass::YourClass(std::size\u t顶点):邻接列表(顶点,std::vector())
{
}
因为它直接调用
向量的构造函数

做作业

 YourClass::YourClass(std::size_t vertices)
 {
     adjacencyList = vector<vector<int> >(vertices, vector<int>());
 }
YourClass::YourClass(std::size\t顶点)
{
邻接列表=向量(顶点,向量());
}
实际上在功能上等同于

 YourClass::YourClass(std::size_t vertices) : adjacencyList()
 {
        adjacencyList = vector<vector<int> >(vertices, vector<int>());
 }
YourClass::YourClass(std::size\t顶点):adjacencyList()
{
邻接列表=向量(顶点,向量());
}
因为所有成员和基都是在进入
YourClass::YourClass
主体之前隐式构造的。(本标准规定了多个基础和构件的施工顺序,但结果仍然相同)

这意味着您的方法构造
邻接列表
,创建临时
向量
,并调用赋值运算符来有效地重新初始化
邻接列表
。最好的情况是(假设
vector
s构造函数和运算符得到了合理的实现,大多数都是这样),这种方法没有比直接初始化更大的开销。最坏的情况是,由于它正在构造更多的临时对象,并且编译器可能不会在不存在的情况下对它们进行优化,因此会产生更大的开销。

类测试
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);
    }    
};
{ 公众: //这样做的好处是,它将始终有效 //即使您有多个构造函数。 向量邻接柱列{顶点}; //与此不同: test():邻接柱状图{顶点} { } 测试() { //这是调用移动分配操作符。 //1)邻接列表空向量是先前创建的。 //2)创建临时向量{顶点}。 //3)临时向量移动到邻接柱状图向量。 //2个构造函数调用和1个移动分配调用。 邻接列表=decltype(邻接列表){顶点}; //使用成员初始值设定项列表或 //使用默认成员初始值设定项或 //使用“调整大小”仅构造单个向量。 } 测试() { //这将是你正在寻找的 邻接柱状图。调整大小(顶点); } };
类测试
{
公众:
//这样做的好处是,它将始终有效
//即使您有多个构造函数。
向量邻接柱列{顶点};
//与此不同:
test():邻接柱状图{顶点}
{
}
测试()
{
//这是调用移动分配操作符。
//1)邻接列表空向量是先前创建的。
//2)创建临时向量{顶点}。
//3)临时向量移动到邻接柱状图向量。
//2个构造函数调用和1个移动分配调用。
邻接列表=decltype(邻接列表){顶点};
//使用成员初始值设定项列表或
//使用默认成员初始值设定项或
//使用“调整大小”仅构造单个向量。
}
测试()
{
//这将是你正在寻找的
邻接柱状图。调整大小(顶点);
}    
};

它是类内初始值设定项/成员初始列表/构造函数主体操作吗?另外,临时的
vector()
也不是必需的。@JamesRoot它是名为
Graph
的类的一个私有变量,我正在构造函数上初始化它。您选择
vector
是为了您的问题吗?这可能适用于任何类别(例如,
aa=A(blah);
vs.
aa(blah);
,当