c++ - 试图理解指向带有 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;
}
解决方案
首先,没有理由在代码中使用单个指针。
接下来,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>
。
推荐阅读
- java - 在heroku上玩scala部署
- python - Swift socket.io 与服务器 python-socketio 兼容的版本
- php - FastCGI 并发。IIS 如何创建新进程?
- sorting - DolphinDB 中的多个排序条件
- python - Plotly 在折线图的 x 轴上显示不必要的额外值
- ios - SwiftUI 导航栏标题
- python - 为什么 pandas str.replace 返回 NaN?
- linux - 按数字升序组合同名但在不同目录中的文件
- node.js - 什么是 fesm2015 以及它与 esm2015 的关系?
- javascript - Svelte - 表单提交和操作