c++ - 在 C++ 中通过引用传递数组

标签 c++ arrays function argument-passing

我有一个 Fortran 代码,我需要在其中对两个相互关联的数组进行排序。我想在 C++ 函数中执行此操作,以便利用 STL 中的内置排序算法。因为 Fortran 是按引用传递的,所以 C++ 函数的所有参数都必须是指针。以下函数 esort 对数组进行了正确排序,但没有返回正确的值。我相信这是因为指针是按值传递的,所以函数末尾的更新没有效果。我应该如何更改我的代码以达到预期的效果?

#include<iostream>
#include<vector>
#include<algorithm>

using namespace std;

void esort(double* lambda, double* vecs, int* n) {

  double* res_lam = new double[*n];
  double* res_vec = new double[*n * *n];
  vector<pair<double, int> > order(*n);

  for (int i=0; i<*n; i++) {
    order[i] = make_pair(lambda[i], i);
  }

  sort(order.rbegin(), order.rend());

  for (int i=0; i<*n; i++) {
    pair<double, int> p = order.at(i);
    res_lam[i] = p.first;
    for (int j=0; j<*n; j++) {
      res_vec[*n*i + j] = vecs[*n*p.second + j];
    }
  }

  lambda = res_lam;
  vecs = res_vec;

  delete [] res_lam;
  delete [] res_vec;

  return;
}

int main() {

  double lambda[] = {0.5, 2.0, 1.0};
  double vecs[] = {0.5, 0.5, 0.5, 2.0, 2.0, 2.0, 1.0, 1.0, 1.0};
  int n = 3;

  esort(lambda, vecs, &n);

  cout << "lambda" << endl;
  for (int i=0; i<n; i++) {
    cout << lambda[i] << " ";
  }
  cout << endl;
  cout << "vecs" << endl;
  for (int i=0; i<n; i++) {
    for (int j=0; j<n; j++) {
      cout << vecs[j*n + i] << " ";
    }
    cout << endl;
  }

  return 0;
}

输出:

lambda
0.5 2 1 
vecs
0.5 2 1 
0.5 2 1 
0.5 2 1

期望的输出:

lambda
0.5 1 2 
vecs
0.5 1 2 
0.5 1 2 
0.5 1 2

编辑 lambda 的第 i 个元素对应于 vecs 的第 i 列(以 Fortran 的列优先顺序)。为了避免在 C++ 中与多维数组发生冲突,我只是将 vecs 表示为 esort 中的一维数组。 esort 的要点是对 lambda 进行排序,然后对 vecs 重新排序,使得 lambda 的第 i 个元素仍然对应于vecs 的第 i 列。

编辑 2: 通过将 cout 语句放在 esort 中,我已确认 res_lam res_vec 具有我希望它们在例程结束时具有的值。我的问题是将这些值返回给调用程序。

最佳答案

C++ 确实按值传递其所有参数,包括指针,这意味着分配给 lambdavecs对调用者没有影响:那些变量仅指向数据。您需要将结果复制到指向的内存中,如下所示使用 copy来自 <algorithm> .还有 rbeginrend是反向迭代器,这导致 sort从你想要的东西向后排序;我改成了beginend .我会进一步建议使用 vector为您临时res_lamres_vec数组。

#include<iostream>
#include<vector>
#include<algorithm>
#include<functional>

using namespace std;

void esort(double* lambda, double* vecs, int* n) {

  vector<double> res_lam(*n);
  vector<double> res_vec(*n * *n);
  vector<pair<double, int> > order(*n);

  for (int i=0; i<*n; i++) {
    order[i] = make_pair(lambda[i], i);
  }

  sort(order.begin(), order.end());

  for (int i=0; i<*n; i++) {
    pair<double, int> p = order.at(i);
    res_lam[i] = p.first;
    for (int j=0; j<*n; j++) {
      res_vec[*n*i + j] = vecs[*n*p.second + j];
    }
  }

  copy(res_lam.begin(), res_lam.end(), lambda);
  copy(res_vec.begin(), res_vec.end(), vecs);
}

关于c++ - 在 C++ 中通过引用传递数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31017108/

相关文章:

c++ - 找不到 Xcode C++ omp.h 文件

java - 为什么 ArrayLists 可以存储不同的对象而数组不能?

javascript - 加载具有相同变量/函数的多个脚本

c - 如何让这个C程序在不修改代码的情况下调用这个函数?

c++ - 对于非常接近 1 的基数,std::pow() 非常慢

c++ - 如何从列表中删除奇数位置?

javascript - 如何使用 Javascript 中的动态链接数组发出多个 Axios 请求?

flutter - 创建可重用小部件的函数和类之间有什么区别?

c++ - 返回一个结构而不初始化它

c - C 中用户定义的数组程序出现问题