在C ++ 11中,{}
优先于()
进行变量初始化。但是,我注意到{}
无法正确初始化向量向量。
鉴于以下代码,vector<vector<int>> mat2(rows, vector<int>(cols, 2))
和vector<vector<int>> mat4{rows, vector<int>(cols, 4)}
按预期工作,但vector<vector<int>> mat1{rows, vector<int>{cols, 1}}
和vector<vector<int>> mat3(rows, vector<int>{cols, 3})
没有。任何人都可以解释原因吗?
#include <iostream>
#include <iomanip>
#include <sstream>
#include <string>
#include <vector>
using namespace std;
string parse_matrix(const vector<vector<int>>& mat)
{
stringstream ss;
for (const auto& row : mat) {
for (const auto& num : row)
ss << std::setw(3) << num;
ss << endl;
}
return ss.str();
}
int main()
{
const int rows = 5;
const int cols = 4;
vector<vector<int>> mat1{rows, vector<int>{cols, 1}};
vector<vector<int>> mat2(rows, vector<int>(cols, 2));
vector<vector<int>> mat3(rows, vector<int>{cols, 3});
vector<vector<int>> mat4{rows, vector<int>(cols, 4)};
cout << "mat1:\n" << parse_matrix(mat1);
cout << "mat2:\n" << parse_matrix(mat2);
cout << "mat3:\n" << parse_matrix(mat3);
cout << "mat4:\n" << parse_matrix(mat4);
}
输出:
$ g++ -Wall -std=c++14 -o vector_test2 vector_test2.cc
$ ./vector_test2
mat1:
4 1
4 1
4 1
4 1
4 1
mat2:
2 2 2 2
2 2 2 2
2 2 2 2
2 2 2 2
2 2 2 2
mat3:
4 3
4 3
4 3
4 3
4 3
mat4:
4 4 4 4
4 4 4 4
4 4 4 4
4 4 4 4
4 4 4 4
答案 0 :(得分:5)
由于多种原因,统一初始化对于std::vector<int>
(更常见的是算术类型的向量)来说是一种破坏。统一初始化使用与列表初始化相同的语法(从initializer_list
构造);当语法不明确时,采用initializer_list
的构造函数优先。
因此,std::vector<int> v(42);
表示“使用std::vector(size_t)
构造函数创建42个零的向量”;而std::vector<int> v{42};
表示“使用std::vector(std::initializer_list)
构造函数创建一个具有值为42”的单个元素的向量。
类似地,std::vector<int> v(5, 10);
使用双参数构造函数来创建5个元素的向量,所有元素的值都为10;而std::vector<int> v{5, 10};
使用initializer_list
- 采用构造函数并创建两个元素的向量,值为5和10。