处理2维向量c++

handling a 2 dimensional vector c++

本文关键字:c++ 向量 2维 处理      更新时间:2023-10-16

我需要在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;

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

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;
    }
}

这不起作用。

向量的大小为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;
    }
}

更理想的情况是,应该使用一维向量,并将其简单地视为二维向量。通过这种方式,您可以一次完成单个内存分配,而不是112个较小的分配。这变得非常挑剔,但很明显,O(1)解决方案比O(n)解决方案要好,因为分配很慢,所以在分配方面比O(n^2)解决方案好。

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

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

首先,这不是一个很好的方法。如果你事先知道尺寸,我实际上建议你在这一点上使用一个普通的二维数组。或者,为了保持"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());
    }
}

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

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;
    }
}
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;
    }
}

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

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
    }
}

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

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

另一件事是,必须将某个东西推到嵌套向量中才能对其进行寻址(使用运算符[])。