【问题标题】:Nested loop to fill a vector of vector of int in C++用于在 C++ 中填充 int 向量的向量的嵌套循环
【发布时间】:2017-12-12 11:19:10
【问题描述】:

我想生成std::vectorstd::vectorint 以表示k 向量,每个向量都包含q 整数,方式如下:

向量 0:{0,1}

向量 1:{2,3}

矢量 2:{4,5}

所以没有。对于这种情况k=3q=2,但它们可以是任何整数> = 1。由于这段代码属于一个更大的项目,我使用了很多声明,其中包括:

typedef int BlockId;
typedef vector< BlockId > ParallelClassIds;

假设每个集合代表一个“并行类”的概念,每个整数代表其元素的ID,我称之为“块”。我已经实现了以下试图创建上述结构的函数(kq 是我声明的 C++ 类中可见的私有变量)

vector< ParallelClassIds > generateResolutionIds(){

    //The variable to be returned
    vector< ParallelClassIds > ret(k, vector< BlockId >(q));

    for (int i = 0; i < k; i++){    
        for(int j = 0; j < q; j++){
            printf("Current parallel class size %ld\n", ret.at(i).size());
            ret.at(i).push_back(i*q+j);
        }
    }

    return ret;
}

但是这个功能有很多问题。首先,printf() 有时会打印 2,有时会打印 3,而我希望它总是打印 q==2。此外,它似乎创建了这样的东西,而不是上面的结构(我通过打印返回的结构检查了这一点):

向量 0:{0,0,0,1}

向量 1:{0,0,2,3}

向量 2:{0,0,4,5}

我真的不知道为什么会发生这种行为。

【问题讨论】:

    标签: c++ c++11 vector initialization


    【解决方案1】:

    问题在于这一行:

    vector< ParallelClassIds > ret(k, vector< BlockId >(q));
    

    结合这一行:

    ret.at(i).push_back(i*q+j);
    

    您正在创建长度为 q 的 k 个向量,然后您继续将其附加到末尾,使它们的长度为 2*q。

    你想做的是:

    vector< ParallelClassIds > ret(k);
    for (int i = 0; i < k; i++){ 
      ret[i].reserve(q);
      ...
    

    【讨论】:

      【解决方案2】:

      你也可以只替换这一行得到预期的结果:

      ret.at(i).push_back(i*q+j);
      

      用这个:

      ret[i][j] = i*q+j;
      

      【讨论】:

        猜你喜欢
        • 2014-11-22
        • 1970-01-01
        • 2016-12-09
        • 2013-03-03
        • 2021-07-29
        • 1970-01-01
        相关资源
        最近更新 更多