处理二维向量c ++

时间:2012-02-20 16:54:34

标签: c++ vector multidimensional-array push-back

我需要在C ++中设置和访问结构的二维向量。 我的结构定义为:

struct nodo{
  int last_prod;
  int last_slot;
  float Z_L;
  float Z_U;
  float g;
  bool fathomed;
};

我将矢量定义为:

vector<vector<struct nodo> > n_2;

现在,我需要创建n_2的几个元素,然后再将它们作为向量,然后访问它们的单个成员。 我怎样才能做到这一点?这是我到目前为止的一段代码:

for(int i=1;i<112;i++){
    n_2.push_back(vector<struct nodo>(111-i));       
    for(int j=1;j<112-i;j++){
      n_2[i][j].last_prod=j;
    }
}

哪个不起作用。

7 个答案:

答案 0 :(得分:3)

向量的大小为0,直到您告诉它调整大小,或者除非您使用特定大小初始化它。在创建向量时传递向量的大小:

for(int i=1;i<112;i++){
    n_2.push_back(vector<struct nodo>(112-i));       
    for(int j=1;j<112-i;j++){
      n_2[i][j].last_prod=j;
    }
}

此外,您似乎正在跳过第0个索引,这意味着您的数组中的第一个值将被跳过。这可能是不受欢迎的。

最后,如果您的数组是常量,请考虑使用std::array而不是std :: vector。请注意,std :: array是一个C ++ 11特性,根据您的编译器可能不可用。

如果我正在编写此代码,我可能会这样写:

#include <array>
using namespace std;

// allocate an array of 112 <struct nodo> arrays, each of size 112
array<array<struct nodo, 112>, 112> n_2;
for (int i = 0; i < 112; i++)
{
    for (int j = 0; j < 112; j++)
    {
        n_2[i][j].last_prod = j;
    }
}

或者,如果我没有支持C ++ 11的编译器:

#include <vector>
using namespace std;

// allocate a vector of size 112 of <struct nodo> vectors, each of size 112
vector<vector<struct nodo> > n_2(112, vector<struct nodo>(112));
for (int i = 0; i < 112; i++)
{
    for (int j = 0; j < 112; j++)
    {
        n_2[i][j].last_prod = j;
    }
}

更理想的是,您应该使用1维向量,并将其简单地视为2维向量。这样,您可以一次完成单个内存分配,而不是112个较小的分配。这非常挑剔,但显然O(1)解决方案优于O(n)解决方案,因为分配速度慢,所以O(n)解决方案在分配方面优于O(n ^ 2)解决方案。

答案 1 :(得分:0)

在外部循环中,你正在创建一个空向量(更新:在问题改变之后,它不再是空的,但仍然不够大);你需要用足够大的尺寸创建它:

n_2.push_back(vector<struct nodo>(112-i));

答案 2 :(得分:0)

首先,这不是一个很好的方法。如果你事先知道尺寸,我实际上建议你使用普通的二维阵列。或者,为了保持“C ++”,你可以将向量包装在某个东西中并提供更易理解的界面。

其次,如果你计划在没有迭代器的情况下直接访问你的向量,你应该从0 开始你的数组索引。

但是,如果你真的想这样做,你的问题是你需要在引用其元素之前填充向量

所以,

n_2.push_back(vector<struct nodo>());
n_2[0].push_back(nodo());

//You can now access n_2[0][0] as there is a single nodo element in there.

您需要确保在访问嵌套向量之前添加了元素,然后才能访问该元素的位置。所以,你的代码可能是:

for(int i=0;i<112;i++){
    n_2.push_back(vector<struct nodo>());       
    for(int j=0;j<112-i;j++){
      //At n_2[i] which we made above, add another nodo.
      n_2[i].push_back(nodo());
    }
}

答案 3 :(得分:0)

我建议你使用调整大小,对我来说,至少它看起来更整洁:

n_2.resize(112);
for(int i = 1; i < 112; i++){
    n_2[i].resize(112- i);  
    for(int j = 1; j < 112 - i; j++){
      n_2[i][j].last_prod = j;
    }
}

答案 4 :(得分:0)

首先要注意的是(在两个周期中)必须从0而不是1开始的起始索引。

另一件事是你必须在嵌套向量中推送一些内容才能解决它(使用operator [])。

答案 5 :(得分:0)

for(int i=1;i<112;i++){
    n_2.push_back(vector<struct nodo>(111-i)); 
    // Here you only have n_2[0] ... n_2[i-1] ( the last pushed is n_2[i-1] )
    // So n_2[i] will be out of range
    // And for n_2[i-1], you only have n_2[i-1][0] ... n_2[i-1][110-i]
    // So be careful of the j's value    
    for(int j=1;j<112-i;j++){
      n_2[i][j].last_prod=j;
    }
}

答案 6 :(得分:0)

您正在尝试访问尚不存在的项目。

for(int i=1;i<112;i++){
    n_2.push_back(vector<struct nodo>()); <--allocates an empty vector    
    for(int j=1;j<112-i;j++){
      n_2[i][j].last_prod=j; <-- accesses indexes in the empty vector
    }
}

提前分配向量中的项目或根据需要创建。更好的选择是使用数组而不是向量,因为您无论如何都不会调整向量的大小。这将有性能提升。