首页 > 解决方案 > 试图理解指向带有 2d vertor 的指针的指针

问题描述

我对 C++ 很陌生,并且无法理解如何使用 2d 向量启动指向指针的指针。我已经搜索了很多,似乎无法找到解决我的问题的方法。在我的例子中,原始的 2d 向量设置在 中,main并通过引用传递给 sub。在那个子程序中,我想设置另一个指针以发送到多个其他子例程。

下面是代码的简化表示。我在dblptr[0][0] = 3;. 错误是:

E0349 没有操作符“=”匹配这些操作数

代码:

#include<iostream>
#include <vector>


using namespace std;


vector<vector<double>> *dblptr;

void SetDblPtr(vector<vector<double>> &arr)
{

    dblptr = &arr;
    dblptr[0][0] = 3;

}


int main()
{
    vector<vector<double>> arr(3, vector<double>(3));

    arr = { {1,2,3}, {1,2,3},{1,2,3} };

    SetDblPtr(arr);

    cin.get();

    return 0;
}

标签: c++

解决方案


首先,没有理由在代码中使用单个指针。

接下来,astd::vector不是 c 数组,它包含的不仅仅是数据(例如大小和容量)。您不能获取向量的地址,然后像尝试那样使用指针算术。如果你想这样做,那么使用data()它会返回一个指向 vectos 基础数据的指针:

 vector<vector<double>> arr(3, vector<double>(3));
 auto fourth_element = arr.data()[3]; 

a 的第四个元素vector<vector<double>>是 avector<double>并且您不能在其上使用指针算术(见上文)。要通过指针算术获得第一个双精度,您将执行以下操作:

 double x = arr.data()[0].data()[0];
                  //^--  pointer to array
                  //   ^-- first element of that array (ie a vector<double>)
                  //          ^-- pointer to array
                  //             ^-- first element of that array (ie a double)

看到这一点应该很明显,你得到的主要是混淆的语法。对于向量,您应该更喜欢使用它operator[]

double y = arr[0][0];

实际上它是相同的,您不必使用指针进行间接循环。

TL;DR:没有理由在这里使用指针。作业应该是:

arr[0][0] = 3;

PS:如此出色的容器的一个原因std::vector是它的数据局部性。但是,由于元素存储在堆上,因此 astd::vector<std::vector<T>>失去了这一巨大优势,通常使用 flat 更好std::vector<T>


推荐阅读