处理2维向量c++
handling a 2 dimensional vector c++
我需要在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开始。
另一件事是,必须将某个东西推到嵌套向量中才能对其进行寻址(使用运算符[])。
- 写入向量<向量<bool>>
- 函数向量_指针有不同的原型,我可以构建一个吗
- std::向量与传递值的动态数组
- 将值指定给向量(2D)的向量中的某个位置
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 如何使用向量的template_back函数
- 尝试通过多个向量访问变量时,向量下标超出范围
- 如何通过派生类函数更改基类中的向量
- C++从另一个类访问公共静态向量的正确方法是什么
- 如何将ampl中的集合表示为c++中的向量
- 变量没有改变?通过向量的函数调用
- 迭代时从向量和内存中删除对象
- 向量 <int> a {N, 0} 和 int arr a[N] = {0} 的时间复杂度有什么区别
- 如何为模板化对象创建模板向量?VS正在投掷C3203
- 计算排序向量的向量中唯一值的计数
- 矩阵向量乘法(cublasDgemv)返回零
- 一对向量构造函数:初始值设定项列表与显式构造
- 将结构向量排序为子组
- 在C++中调整向量中的索引
- 向量元素的引用地址与它所指向的向量元素的地址不同.为什么