将参考传递到STL向量中的偏移位置

问题描述 投票:1回答:3

我正在尝试将一些旧的C函数转换为C ++。我的原始程序将矩阵存储在单个数组中,我只是将指向第一个元素的指针传递给函数,以便在正确的行上工作,例如

double f1(int *a){
 return a[0] + a[1];
}

int main(void){
  int x[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
  for(i = 0; i < 5; i++){
  printf("%d\n", f1(&x[2 * i]));
}

我希望能够使用STL without复制来做类似的事情。所以我的程序看起来像这样

double f1(vector<int>& a){
 return a[0] + a[1];
}
int main(void){
  int x[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
  vector<int> y(x, x + 10);

  for(i = 0; i < 5; i++){
     cout << f1(y) << endl; // This is clearly wrong
}

我将如何做?我可以更改函数以接收对vector :: iterator的引用,但是还有另一种方法吗?

c++ stl
3个回答
2
投票

您可以简单地将迭代器传递给函数。随机访问迭代器与指针非常相似(实际上,指针符合随机访问迭代器的条件。)例如,

#include <vector>

double f1(std::vector<int>::const_iterator a)
{
    return a[0] + a[1];
}

#include <iostream>

int main()
{
  vector<int> y{1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

  auto it = y.cbegin();

  for(int i = 0; i < y.size()/2; ++i)
      std::cout << f1(it + 2*i) <<std::endl;
}

2
投票

写入数组视图。数组视图是一对具有beginendsize emptyoperator[]frontback方法的指针,以及C数组,std::array<T,N>&std::vector<T,A>&,[ C0],std::vector<non_const_T,A>const&std::array<non_const_T,N>const&

Oh,以及std::initializer_list<non_const_T>T*,size_t ctor,它们非常适合切片(使用转发ctor:T*,T*-> T*,size_t,以及其他所有2个)。

它不拥有其数据,因此它的所有方法都是T*,T*,除了const。 (非operator=方法将是更改视图范围的方法-更改元素是对视图的const操作。

然后

const

1
投票

您不需要进行太多更改:

double f1(array_view<const int> a){
  return a[0] + a[1];
}
© www.soinside.com 2019 - 2024. All rights reserved.