【问题标题】:Initializing a two dimensional std::vector初始化二维 std::vector
【发布时间】:2013-07-13 20:17:36
【问题描述】:

所以,我有以下内容:

std::vector< std::vector <int> > fog;

我很天真地初始化它:

    for(int i=0; i<A_NUMBER; i++)
    {
            std::vector <int> fogRow;
            for(int j=0; j<OTHER_NUMBER; j++)
            {
                 fogRow.push_back( 0 );
            }
            fog.push_back(fogRow);
    }

而且感觉很不对劲……有没有像这样初始化向量的另一种方法?

【问题讨论】:

  • 如果您不需要比std::vector&lt;int&gt;::max_size() 更多的空间,我建议您为二维向量使用一维向量实现。 Here
  • 如果至少有一个答案不涉及复制内部向量,那就太好了:memset 比 memcpy 快(如果 operator new 得到 calloc 甚至更好内联)。

标签: c++ vector


【解决方案1】:

使用接受初始大小和默认值的std::vector::vector(count, value) 构造函数:

std::vector<std::vector<int> > fog(
    ROW_COUNT,
    std::vector<int>(COLUMN_COUNT)); // Defaults to zero initial value

如果一个非零值,例如4,则需要作为默认值:

std::vector<std::vector<int> > fog(
    ROW_COUNT,
    std::vector<int>(COLUMN_COUNT, 4));

我还应该提到在 C++11 中引入了统一初始化,它允许使用 {} 初始化 vector 和其他容器:

std::vector<std::vector<int> > fog { { 1, 1, 1 },
                                    { 2, 2, 2 } };
                           

【讨论】:

  • 如果我把std :: vector &lt;std :: vector &lt;int&gt;&gt;的存储类设为static呢?
【解决方案2】:

假设您要初始化二维向量 m*n,初始值为 0

我们可以这样做

#include<iostream>
int main(){ 
    int m = 2, n = 5;

    vector<vector<int>> vec(m, vector<int> (n, 0));

    return 0;
}

【讨论】:

  • 因为这个答案刚刚获得了“好答案”。其他人已经给出了相同的答案,但是当我来到这篇文章时,那些赞成这个答案的人可能和我相似,我们没有认识到其他一些答案实际上是相同的答案。我认为这可能是因为三个原因:1)这段代码可以被复制、粘贴和立即运行 2)std:: 使它更长,人们可能喜欢简短而直接的答案; 3) 变量的长命名使初学者感到困惑。我也是初学者,真的不知道我们需要std::有多重要,需要一个可运行的代码,所以我知道每个变量的作用
【解决方案3】:

std::vector 中没有 append 方法,但是如果你想制作一个包含 A_NUMBER 的向量的向量,int 的每个向量都包含 other_number 零,那么你可以这样做:

std::vector<std::vector<int>> fog(A_NUMBER, std::vector<int>(OTHER_NUMBER));

【讨论】:

    【解决方案4】:

    如前所述,一般语法是:

    std::vector<std::vector<int> > v (A_NUMBER, std::vector <int> (OTHER_NUMBER, DEFAULT_VALUE))  
    

    在这里,向量“v”可以可视化为一个二维数组,其中包含“A_NUMBER”行,“OTHER_NUMBER”列,其初始值设置为“DEFAULT_VALUE”。

    也可以这样写:

    std::vector <int> line(OTHER_NUMBER, DEFAULT_VALUE)
    std::vector<std::vector<int> > v(A_NUMBER, line)
    

    在二维向量中输入值类似于在二维数组中输入值:

    for(int i = 0; i < A_NUMBER; i++) {
         for(int j = 0; j < OTHER_NUMBER; j++) {
             std::cin >> v[i][j]
         }
    }
    

    其他答案中已经说明了示例......!

    【讨论】:

      【解决方案5】:

      推荐的方法是使用填充构造函数来初始化具有给定默认值的二维向量 :

      std::vector<std::vector<int>> fog(M, std::vector<int>(N, default_value));
      

      在哪里, M 和 N 是二维向量的维度。

      【讨论】:

        【解决方案6】:

        我认为最简单的方法是:

        std::vector<std::vector<int>>v(10,std::vector<int>(11,100));
        

        10是外部或全局向量的大小,是主要的,11是int类型的内部向量的大小,初始值初始化为100!这是我在堆栈上的第一个帮助,我认为它可以帮助某人。

        【讨论】:

          【解决方案7】:

          假设您要初始化一个二维整数向量,其中 n 行和 m 列每列的值为 'VAL'

          写成

          std::vector&lt;vector&lt;int&gt;&gt; arr(n, vector&lt;int&gt;(m,VAL));

          这个VAL可以是整数类型变量常量比如100

          【讨论】:

            【解决方案8】:

            这对我有用:

            vector<vector<int>> minA{ROW_SIZE, vector<int>(COLUMN_SIZE, VALUE)};
            

            【讨论】:

            • 有趣,我认为我们应该用括号括住ROW_SIZE, vector&lt;int&gt;(COLUMN_SIZE, VALUE),而不是花括号(我知道你的也可以)。
            【解决方案9】:

            此代码 sn-p 将一个二维向量复制到另一个。并让我们清楚地了解如何初始化二维向量。

            void copyVectorToVector(vector<vector<int>> matrix) {
            
                    int rowNumber = matrix.size();
                    int columnNumber = matrix[0].size();
                    vector<vector<int>> result(rowNumber, vector<int> (columnNumber, 0));
            
                    for(int i=0;i<matrix.size();i++){
                        for(int j=0;j<matrix[i].size();j++){
                            result[i][j] = matrix[i][j];
                            cout<<result[i][j]<<" ";
                        }
                        cout<<endl;
                    }
            }
            

            【讨论】:

              【解决方案10】:

              这个答案将有助于在声明后轻松初始化二维向量。

              int n=4,m=3;
              int default_value = 0;
              
              std::vector<std::vector<int>> matrix;
              
              matrix.resize(m, std::vector<int>(n, default_value));
              

              【讨论】:

                【解决方案11】:

                带有二维向量的乘法表 前 10 个用于 ROW,后 10 个用于 COLUMN

                std::vector<std::vector<int>> multiplication (10,std::vector<int>(10));
                for(int i{0}; i<multiplication.size(); ++i){
                    for(int j{0}; j<multiplication[i].size(); ++j){
                        multiplication[i][j] = j * i;
                    }
                }
                
                for(int i{1}; i < multiplication.size(); ++i){
                    for(int j{1}; j < multiplication[i].size(); ++j){
                        std::cout<<multiplication[i][j]<<"\t";
                    }
                    printf("\n");
                }
                

                【讨论】:

                • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
                【解决方案12】:

                我的c++ STL 代码用zero 初始化5*3 2-D vector

                
                #include <iostream>
                using namespace std;
                #include <vector>
                int main()
                {// if we wnt to initialise a 2 D vector with 0;
                
                    vector<vector<int>> v1(5, vector<int>(3,0));
                
                    for(int i=0;i<v1.size();i++) 
                {
                        for(int j=0;j<v1[i].size();j++)
                
                           cout<<v1[i][j]<<" ";
                
                            cout<<endl;
                    }
                }
                

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2013-06-06
                  • 2012-06-09
                  • 1970-01-01
                  • 2012-08-07
                  • 2017-04-04
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多