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++中向量的指针运算的主要内容,如果未能解决你的问题,请参考以下文章