【问题标题】:How to fill `std::vector<std::vector<T> >` with default values?如何用默认值填充`std::vector<std::vector<T> >`?
【发布时间】:2011-11-11 11:56:02
【问题描述】:

所以我试试这个:

std::vector< std::vector<int> > matrix(4);

matrix[0][0] = 1;
matrix[0][1] = 2;
matrix[0][2] = 3;
matrix[0][3] = 1;

matrix[1][0] = 1;
matrix[1][1] = 2;
matrix[1][2] = 3;
matrix[1][3] = 1;

matrix[2][0] = 1;
matrix[2][1] = 2;
matrix[2][2] = 3;
matrix[2][3] = 1;

matrix[3][0] = 1;
matrix[3][1] = 2;
matrix[3][2] = 3;
matrix[3][3] = 1;

但是出了点问题,我的应用在运行时死掉了=(怎么办?如何正确地将值嵌入向量的向量中?

【问题讨论】:

  • 除了不调整向量的大小,还能用c++11吗?
  • 不,遗憾的是我没有 C++11=(
  • 但我确实想知道如何在 C++11 中以不同的方式做到这一点?
  • 您可能希望提供一个模拟矩阵的类,该类具有 4x4 元素的单个分配和operator()(int,int) 来访问每个元素。这是提供 N 维数组的常见模式(单个分配器,获取 N 个索引并在内部执行算术的访问器)
  • @user1040114: c++11 可以使用类似{{1,2,3,4},{5,6,7,8}} 之类的统一初始化语法...您也可以在 c++03 中使用 boost assign

标签: c++ stl vector std


【解决方案1】:

使用这个:

std::vector< std::vector<int> > matrix(4, std::vector<int>(4));

这将使用 4 个 std::vector&lt;int&gt;(4) 副本初始化您的外部向量。

【讨论】:

    【解决方案2】:

    在这种情况下,您可以进一步采用 Björn 的方法,并使用您提供的值完全初始化 2D 向量:

    std::vector<int> tmp(4,0); 
    tmp[0] = 1;
    tmp[1] = 2;
    tmp[2] = 3;
    tmp[3] = 1;
    
    std::vector< std::vector<int> > matrix(4, tmp);
    

    可以简单地写成:

    std::vector<int> tmp(4,1); 
    tmp[1] = 2;
    tmp[2] = 3;
    
    std::vector< std::vector<int> > matrix(4, tmp);
    

    但为了清晰起见,我通常更喜欢第一个。

    【讨论】:

    • +1:您可以使用Boost.Assign 使之变得更好。
    • @Björn …或者你可以参考我的例子,就像我做你的一样;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-31
    • 2018-02-02
    • 2017-09-01
    • 2019-10-20
    • 2017-10-26
    • 2011-12-27
    • 1970-01-01
    相关资源
    最近更新 更多