我需要在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;
}
}
哪个不起作用。
答案 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
}
}
提前分配向量中的项目或根据需要创建。更好的选择是使用数组而不是向量,因为您无论如何都不会调整向量的大小。这将有性能提升。