反正有吗?目前我用的是这样的:
for( i=0;i<PU_number;i++)
{
for( j=0;j<=time_slots;j++)
myMatrix.tempVec.push_back(0.0);
myMatrix.value.push_back(myMatrix.tempVec);
myMatrix.tempVec.clear();
}
然而,它对我没用。有时我需要更改此向量中的特定地址。比如myMatrix.tempVec[1][4]
。当我这样做时:
myMatrix.value[i][j]=value;
它破坏了记忆,我得到SIGABRT
,SIGSESV
以及很多类似的东西。当我这样做时,valgrind也会变得疯狂。但我需要一种合适的方法来做到这一点。
myMatrix.value.resize(PU_number);
for( i=0;i<PU_number;i++)
myMatrix.value[i].resize(time_slots);
然后:
for( i=0;i<PU_number;i++)
{
for( j=0;j<time_slots;j++)
{
for( k=0;k<number_of_packets;k++)
{
double r=((double) rand() / (RAND_MAX));
for( x=myMatrix.mat[i][k];x<=myMatrix.mat[i][k]+myMatrix.len[i][k];x++)
myMatrix.value[i][x]=r;
}
}
}
我得到了#34;无效的写入大小8&#34;再次在valgrind。
答案 0 :(得分:2)
在通过索引访问任何值之前,可以使用std::vector::resize()
函数正确设置矩阵的尺寸。
这是一个小样本
myMatrix.resize(PU_number);
for( i=0;i<PU_number;i++) {
myMatrix[i].resize(time_slots);
for( j=0;j<=time_slots;j++)
myMatrix[i][j] = 0.0;
}
答案 1 :(得分:1)
你可以使用std :: vector&gt; 像这里:
#include <vector>
#include <iostream>
int main()
{
std::vector<std::vector<int> > vec;
vec.resize(10);
for (unsigned int i = 0 ; i < vec.size(); ++i)
{
vec[i].resize(10);
}
vec[1][4] = 3;
vec[1].push_back(5)
std::cout << "vec[1][4] = " << vec[1][4] << std::endl;
std::cout << "vec[1][10] = " << vec[1][10] << std::endl;
return (0);
}
我创建了一个大小为10的向量,其中包含其他大小为10的向量; 请注意,您必须使用resize来获取std :: vector&gt;的大小。但是如果你想添加一个大小,你可以使用vec [i] .push_back(5);