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

标签 c++11 matrix vector

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

给定以下代码,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

最佳答案

出于多种原因,对于std::vector<int>(更常见的是算术类型的 vector ),统一初始化有点不好。统一初始化使用与列表初始化相同的语法(由initializer_list构造);当语法不明确时,采用initializer_list的构造函数优先。

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

同样,std::vector<int> v(5, 10);使用两参数构造函数创建一个由5个元素组成的 vector ,所有元素的值均为10;而std::vector<int> v{5, 10};使用initializer_list接受构造函数并创建两个元素(值5和10)的 vector 。

关于c++11 - 向量初始化的C++ 11向量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49932144/

相关文章:

c++ - tbb中调用task::spawn_root_and_wait调试报错

c++ - 如何释放指针 vector 中的元素?

使用 std::move 时由于 move 构造函数与其他非 move 构造函数之间的冲突而导致 C++ 编译错误

c++ - 使用 ref-qualifiers 成员函数重载的调用不明确

c++ - 实例化点可以延迟到翻译单元结束吗?

c++ - 保留集合中最小的 n 个元素,丢弃其他元素

python - 在python中将一个矩阵的每一行复制到另一个空矩阵的每一行

c - 使用迭代法计算逆矩阵

r - 聚类中的大距离矩阵

elasticsearch - 密集向量数组和余弦相似度