c++中向量的指针运算

Posted

技术标签:

【中文标题】c++中向量的指针运算【英文标题】:pointer arithmetic on vectors in c++ 【发布时间】:2009-08-26 08:03:10 【问题描述】:

我有一个std::vector,即

vector<vector<vector> > > mdata;

我想将数据从我的 mdata 向量传递到 GSL 函数

gsl_spline_init(gsl_spline * spline, const double xa[], const double ya[], size_t size);

就像你一样。我已经发现我可以做类似的事情

gsl_spline_init(spline, &(mgrid.front()), &(mdata[i][j][k].front()), mgrid.size());

如果我想将固定 i,j 的数据从 mdata 传递到 gsl_spline_init(),这很好。

但是,现在我需要传递 mdata 的第一个维度,所以对于固定的 j,k。

我知道对于任何两个固定索引,沿其余维度的所有向量都具有相同的长度,因此我的向量是“常规立方体”。所以我需要的所有值之间的偏移量应该是相同的。

当然我可以创建一个临时向量

int j = 123;
int k = 321;
vector<double> tmp;
for (int i = 0: i < mdata.size(); i++)
    tmp.push_back(mdata[i][j][k]);
gsl_spline_init(spline, &(mgrid.front()), &(tmp.front()), mgrid.size());

但这似乎太复杂了。也许有一种方法可以通过指针运算来实现我的目标?

非常感谢任何帮助:)

【问题讨论】:

您可能想要搜索潜伏在网络上的矩阵类之一。向量的向量的向量气味。 【参考方案1】:

如果不重新设计数组使用者函数 gsl_spline_init(),您确实无法做到这一点 - 它依赖于作为连续数据块传递的数据。这不是你的三级向量的情况 - 它不仅是一个立方体,而且每个级别都在堆上分配了一个单独的缓冲区。

【讨论】:

【参考方案2】:

这是不可能的。不仅是向量,即使是普通数组,也只有最后一个维度是连续的数据块。如果gsl_spline_init 使用迭代器而不是数组,您可以尝试制作一些仿函数来选择合适的数据,但我不确定是否值得尝试。没有指针算术可以帮助你。

【讨论】:

一个数组'int a[5][6][7];'位于连续内存中,可以通过指针串行遍历。 我的意思是值 a[1][2][0]、a[1][2][1]、a[1][2][2] 等等,使内存的连续部分,它们可以传递做函数。值 a[0][1][2]、a[1][1][2]、a[2][1][2] 不构成内存的连续部分,它们不能传递给功能。

以上是关于c++中向量的指针运算的主要内容,如果未能解决你的问题,请参考以下文章

C++指针的算术运算 关系运算

C++ 风格的转换运算符是不是会更改它转换的指针?

C++ 中的指针成员 ->* 和 .* 运算符是啥?

C++函数调用运算符 函数对象 函数指针

C++:在没有解引用运算符的情况下访问“数组指针”的值?

字符串类型数组的指针运算,C++如何处理这个?