为什么这不能访问向量位置?

时间:2013-03-24 23:35:17

标签: c++ vector void-pointers

我正在为我的课写一个回溯问题,我必须实现一些现有的功能。这是我必须实现的功能之一。 void *input是我们应该传递数据的地方,在我的例子中是一个二维向量。

void process_solution(int a[], int k, void *input, bool *finished)
{
    int sumweight = 0;
    int sumvalue = 0;
    std::vector<std::vector<int> > *datavector = static_cast<std::vector<std::vector<int> >* >(input);
    for(unsigned i=0; i<sizeof(a); i++)
    {
        sumweight += a[i]*datavector[i][0];
        sumvalue += a[i]*datavector[i][1];
    }
}

但是,我认为我的演员有问题,因为我在第sumweight += a[i]*datavector[i][0];

时收到错误
  

错误:'*中没有匹配'operator *'(*((long long unsigned int)((long long unsigned int)i)* 4ull)))*(data long unsigned int )(((long long unsigned int)i)* 24ull))) - &gt; std :: vector&lt; _Tp,_Alloc&gt; :: operator [] with _Tp = std :: vector,_Alloc = std :: allocator&gt;, std :: vector&lt; _Tp,_Alloc&gt; :: reference = std :: vector&amp;,std :: vector&lt; _Tp,_Alloc&gt; :: size_type = long long unsigned int'

如果我尝试使用另一个变量来访问向量,例如int t1 = datavector[i][0];,我会收到错误

  

错误:无法在初始化

中将'std :: vector'转换为'int'

我认为只要进行了适当的演员,就可以使用无效指针来传递任何东西。这是怎么回事?

2 个答案:

答案 0 :(得分:4)

您的datavector变量是指针int向量的向量,因此您应该应用正确的解除引用:

sumweight += a[i] * (*datavector)[i][0];
//                  ^^^^^^^^^^^^^

sumvalue += a[i] * (*datavector)[i][1];
//                 ^^^^^^^^^^^^^

此外,这:

for (unsigned i=0; i < sizeof(a); i++)
//                     ^^^^^^^^^

计算数组中元素的数量(这使我认为你没有使用的k参数意味着包含该数组的长度)

答案 1 :(得分:1)

首先,你的循环是错误的:

for(unsigned i=0; i<sizeof(a); i++)

sizeof(a)始终为sizeof(int*),因为无论您的签名如何,都无法将数组传递给函数。参数将是一个指针,所以你永远不会正确访问你的向量。

你的下一个问题是你有一个指向一个向量的指针(一般来说是个坏主意),但你没有正确解除引用它你需要一个解引用才能索引到下一个向量(然后进入下一个向量...) ,即

sumweight += a[i] * (*datavector)[i][0];

接下来,问问自己;为什么要处理指向矢量指针向量的指针?这是一个非常草率和容易出错的解决方案。