我对C++非常陌生,很难理解如何用2d向量启动指向指针的指针。我找了很多东西,似乎找不到解决问题的办法。在我的例子中,原始的2d向量是在main中设置的,并通过引用传递给子。在该子程序中,我希望设置另一个指针,以发送到多个其他子程序。
下面是代码的简化表示形式。我在dblptr[0][0] = 3;的潜艇上出了个错误。错误是:
E0349 no运算符"=“匹配这些操作数
代码:
#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;
}发布于 2019-09-26 19:44:13
首先,没有理由在代码中使用单个指针。
接下来,std::vector不是c数组,它包含的不仅仅是数据(例如大小和容量)。您不能获取向量的地址,然后在尝试时使用指针算法。如果您想这样做,那么使用data(),它将返回一个指向基础数据的向量的指针:
vector<vector<double>> arr(3, vector<double>(3));
auto fourth_element = arr.data()[3]; vector<vector<double>>的第四个元素是vector<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;博士:没有理由在这里使用指针。任务应是:
arr[0][0] = 3;PS:为什么std::vector是如此优秀的容器,原因之一是它的数据局部性。但是,当元素存储在堆中时,std::vector<std::vector<T>>就失去了这一巨大的优势,通常最好使用平面std::vector<T>。
发布于 2019-09-26 20:10:08
这一行造成了以下问题:
dblptr[0][0] = 3;代之以:
(*dblptr)[0][0] = 3;https://stackoverflow.com/questions/58123570
复制相似问题