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

Why is this not accessing the vector position?

本文关键字:向量 位置 访问 不能 为什么      更新时间:2023-10-16

我正在为我的类写一个回溯问题,我必须实现一些现有的函数。这是我要实现的函数之一。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];
    }
}

然而,我相信我的cast有问题,因为我在sumweight += a[i]*datavector[i][0];

行得到一个错误

错误:在'*(a + ((long long unsigned int)(((long long unsigned int)i) * 4ull))中没有匹配'operator*') *(datavector + ((long long unsigned int)(((long long unsigned int)i) * 24ull)))->std::vector<_Tp, _Alloc>::operator[] with _Tp = std::vector, _Alloc = std::allocator>, std::vector<_Tp, _Alloc>::reference = std::vector&, std::vector<_Tp, _Alloc>::reference = std::vector&, std::vector<_Tp, _Alloc>::size_type = long long unsigned int'

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

错误:初始化时无法将std::vector转换为int

我认为void指针可以用来传递任何东西,只要进行了适当的强制转换。这是怎么回事?

您的datavector变量是一个指针指向int的向量的向量,因此您应该应用适当的解引用:

sumweight += a[i] * (*datavector)[i][0];
//                  ^^^^^^^^^^^^^
sumvalue += a[i] * (*datavector)[i][1];
//                 ^^^^^^^^^^^^^
此外,

:

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

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

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

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

sizeof(a)将始终是sizeof(int*),因为无论您的签名如何,都不能将数组传递给函数。实参将是一个指针,因此永远无法正确访问vector对象。

你的下一个问题是你有一个指向一个向量的指针(通常是坏主意),但你没有正确地解引用它。你需要在索引到下一个向量之前解引用(然后到下一个向量…),即

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

接下来,问你自己;为什么要处理指向向量的指针指向向量的指针?