【问题标题】:C++11 vector of vectors initialization向量初始化的 C++11 向量
【发布时间】:2018-09-30 14:39:02
【问题描述】:

在 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

【问题讨论】:

  • 不确定这是否是一个完整的答案,但对于每个矩阵,您都使用不同的括号和大括号组合。建议您在尝试调试之前标准化您的调用。
  • @Immersive 如果你真的阅读了这个问题,你就会意识到括号/大括号的变化是整个探究的重点。
  • 公平的警察。我略读了一下,读作“为什么输出不一致”。

标签: c++11 matrix vector


【解决方案1】:

由于多种原因,统一初始化对于std::vector&lt;int&gt;(更一般地说,算术类型的向量)有点破坏。统一初始化使用与列表初始化相同的语法(从initializer_list构造);当语法不明确时,采用initializer_list 的构造函数优先。

因此,std::vector&lt;int&gt; v(42); 的意思是“使用 std::vector(size_t) 构造函数创建一个 42 个零的向量”;而std::vector&lt;int&gt; v{42}; 的意思是“使用std::vector(std::initializer_list) 构造函数来创建一个具有值为42 的单个元素的向量”。

同样,std::vector&lt;int&gt; v(5, 10); 使用双参数构造函数创建一个包含 5 个元素的向量,所有元素的值为 10;而std::vector&lt;int&gt; v{5, 10}; 使用initializer_list-taking 构造函数并创建一个包含两个元素的向量,值5 和10。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-12
    • 1970-01-01
    • 2015-09-20
    • 1970-01-01
    • 2011-05-18
    • 1970-01-01
    • 2011-03-04
    • 2012-12-08
    相关资源
    最近更新 更多