C++11 C++;11向量的向量初始化

C++11 C++;11向量的向量初始化,c++11,matrix,vector,C++11,Matrix,Vector,在C++11中,对于变量初始化,{}优于()。但是,我注意到,{}无法正确初始化向量的向量 给定以下代码,vector mat2(rows,vector(cols,2))和vector mat4{rows,vector(cols,4)}按预期工作,但vector mat1{rows,vector{cols,1}和vector mat3(rows,vector{cols,3})不工作。有人能解释为什么吗 #include <iostream> #include <iomanip&

在C++11中,对于变量初始化,
{}
优于
()
。但是,我注意到,
{}
无法正确初始化向量的向量

给定以下代码,
vector mat2(rows,vector(cols,2))
vector mat4{rows,vector(cols,4)}
按预期工作,但
vector mat1{rows,vector{cols,1}
vector mat3(rows,vector{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);
}

出于多种原因,统一初始化对于
std::vector
(更一般地说,是算术类型的vector)来说有点不正确。统一初始化使用与列表初始化相同的语法(从
初始化器\u list
构造);当语法不明确时,采用
初始值设定项\u list
的构造函数优先

因此,
std::vectorv(42)表示“使用
std::vector(size\t)
构造函数创建42个零的向量”;而
std::vector v{42}表示“使用
std::vector(std::initializer\u list)
constructor创建一个具有值42的单个元素的向量”


类似地,
std::vectorv(5,10)
使用双参数构造函数创建一个包含5个元素的向量,所有元素的值均为10;而
std::vector v{5,10}
使用
初始值设定项\u list
-使用构造函数并创建两个元素的向量,值5和10。

不确定这是否是一个完整的答案,但对于每个矩阵,您使用的是括号和大括号的不同组合。建议您在尝试调试之前对调用进行标准化。@沉浸式如果您真的阅读了问题,您就会意识到parens/branes的变化是整个查询的重点。公平。我略读了一下,读起来是“为什么输出不一致”。
$ 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