如何像使用2D数组一样给二维向量赋值

3
有没有其他方法可以做到这一点?目前我是这样使用的:
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;

这会损坏内存,我会收到 SIGABRTSIGSESV 等很多类似的东西。当我这样做时,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;

        }
    }
}

我在valgrind中又遇到了"Invalid write of size 8"。


感谢您使用Valgrind。首先请修复它所识别出的问题。 - WhozCraig
@WhozCraig,它就是不接受我上面说的方法。它会多次显示“大小为8的无效写入”。 - user4539435
@Whcrs,你的for( x=myMatrix.mat[i][k];x<=myMatrix.mat[i][k]+myMatrix.len[i][k];x++)循环对我来说没有太多意义。 - πάντα ῥεῖ
我知道,这很难理解。甚至我自己都不记得我做了什么 :) 但是我可以告诉你,在原始消息中我提到的第一种方法中使用时,我在valgrind中没有收到任何错误。我只记得这是正确的。 - user4539435
2个回答

3

有一个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;
}

这个能让我像二维数组一样赋值吗? - user4539435
@Whcrs 它使您能够事先设置向量的大小。请阅读链接的参考文档。 - πάντα ῥεῖ
我知道了。我现在已经做了。Valgrind又疯了。 - user4539435
谢谢,我解决了。但请保持关注,我想大约半个小时后,我将不得不将这个“结构体”传递到项目中的另一个源文件中。你知道的,“extern” :)) - user4539435

2
你可以像这样使用 std::vector > :
#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 >的大小,但是如果您想要添加一个大小,则可以使用vec [i] .push_back(5);


vec[1][10] 访问越界。 - πάντα ῥεῖ
不是因为push_back会加1,我尝试了一下,因为它可以工作。 - Gabrielle de Grimouard

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接