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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C ++ 11向量的向量初始化相关的知识,希望对你有一定的参考价值。

在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:
" << parse_matrix(mat1);
    cout << "mat2:
" << parse_matrix(mat2);
    cout << "mat3:
" << parse_matrix(mat3);
    cout << "mat4:
" << 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
答案

由于多种原因,统一初始化对于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-taking构造函数并创建两个元素的向量,值为5和10。

以上是关于C ++ 11向量的向量初始化的主要内容,如果未能解决你的问题,请参考以下文章

c++11 函数调用中的向量初始化

我可以对带有变量的向量使用 C++11 列表初始化器语法吗?

返回类型向量

引用向量的部分片段?

C - 如何使用 GCC SSE 向量扩展访问向量的元素

C ++:如何用非零大小初始化地图中的向量