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