传递对STL向量中偏移位置的引用

Passing a reference to an offset position in an STL vector

本文关键字:位置 引用 STL 向量      更新时间:2023-10-16

我正在尝试将一些旧的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("%dn", f1(&x[2 * i]));
}

我希望能够在不复制的情况下使用STL进行类似的操作。所以我的程序看起来像这个

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::迭代器的引用,但有其他方法吗?

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

#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;
}

编写数组视图。数组视图是一对具有beginendsizeemptyoperator[]frontback方法的指针,以及来自C数组、std::array<T,N>&std::vector<T,A>&std::vector<non_const_T,A>const&std::array<non_const_T,N>const&std::initializer_list<non_const_T>等的构造函数。

哦,还有T*,size_tT*,T*因子,它们非常适合切片(使用转发因子:T*,size_t->T*,T*,以及这2个的所有其他因子)。

它不拥有自己的数据,所以除了operator=之外,它的所有方法都是const。(非const方法将是更改视图范围的方法——更改元素是对视图的const操作)。

然后

double f1(array_view<const int> a){
  return a[0] + a[1];
}

您不需要做这么多更改:

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