我有一个包含vector<vector<int>> adjacencyLists;
哪个更常用于初始化矢量矢量?
1)
adjacencyLists = vector<vector<int>>(vertices, vector<int>());
2)
vector<vector<int>> adjacencyLists(vertices, vector<int>());
我个人认为第一个因为=
标志而更加清晰,但我觉得人们经常使用第二个,这是真的吗?
答案 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);
}
};