【问题标题】:Passing and modifying array of vectors through functions in c++通过C++中的函数传递和修改向量数组
【发布时间】:2016-11-24 07:42:24
【问题描述】:

(我来自 C 背景,是 C++ 及其 STL 的新手)
我正在编写一个 C++ 向量数组,它将通过函数传递(作为向量数组的引用)并在其中进行处理。
在这种情况下,[在 C 中] 我会传递一个指向我的自定义数据类型的指针(在后台按值调用。)
我的代码在尝试这样做时在编译时出错:

#include <cstdio>
#include <vector>

using namespace std;

/* 
the problem is I can't get the syntax. vector<type> &var is
a reference to a single dimension array of vectors.   
*/

void pass_arrayOf_vect(vector<int> &array, int lmt);

int main() {

  int lmt = 10;

  vector<int> lst[lmt];

  pass_arrayOf_vect(lst, lmt);

  return 0;
}

/*
and the traditional ambiguity of whether using "."  or "->" for 
accessing or modifying indexes and their members.
*/

void pass_arrayOf_vect(vector<int> &lst, int lmt) {


      for (int i = 0; i < lmt; i++) {

          lst[i].push_back(i*i);

      }


      for (int i = 0; i < lmt; i++) {
        printf("array[%d]: ", i);
        for (int j = 0; j < lst[i].size(); j++) {

            printf("%d ",lst[i][j]);
        }
        printf("\n");
      }

     printf("\n");

     return;
}

【问题讨论】:

  • 要使用向量数组,请写vector&lt;vector&lt;int&gt;&gt;
  • 小心vector&lt;int&gt; lst[lmt]; 因为lmt 不是编译时常量,所以这就是所谓的可变长度数组。它们不是标准 C++ 的一部分,只有少数编译器支持它们。如果您在 GCC 中构建程序并将程序提交给使用 Visual Studio 的人,这会让生活变得一团糟。
  • 既然你来自 C,你可能应该马上知道 C++ 标准不支持你在这里的可变长度数组(VLA)(甚至通过扩展支持它的流氓编译器也可能会在元素基础的非 POD 类型的位置呕吐),所以我首先要避开那些。其次,只要您对本网站上报告的编译器错误有任何疑问(如您所说,“...在编译时给出错误”总是在您的帖子中包含错误逐字 .
  • @WhozCraig 明白了这一点。那么标准做法是什么?在 main() 或其他函数中修改向量数组?

标签: c++ pointers vector reference stl


【解决方案1】:

main 函数中,lst 变量是一个向量数组。当你将它传递给pass_arrayOf_vect 函数时,你传递了一个指向第一个元素的指针。

即当你这样做时

pass_arrayOf_vect(lst, lmt);

其实和做的一样

pass_arrayOf_vect(&lst[0], lmt);

所以你调用的函数需要接受一个指向向量的指针作为它的第一个参数(不是引用):

void pass_arrayOf_vect(vector<int> *array, int lmt);
//                                 ^
// Note use of asterisk instead of ampersand

一个更好的解决方案是使用std::array 向量代替。或者,如果您使用的是不支持 std::array 的旧编译器,或者需要运行时可配置的数量(在这种情况下,无论如何您都不能使用纯 C 样式数组),请使用向量向量。

【讨论】:

  • 正是我想知道的。那么标准做法是什么?在 main() 或其他函数中修改向量数组?
  • @ph03n1x 修改向量的位置取决于您的程序,以及您想要做什么和完成什么。对于像您这样的简单程序,这并不重要,只是使用一两个函数可能会增加可读性。
  • 现在我主要使用 C++ 来解决编程问题。稍后将其用于 Linux 内核/系统编程(如果需要)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-27
  • 1970-01-01
  • 2015-05-24
  • 1970-01-01
  • 2019-05-18
  • 2015-05-19
  • 2019-10-19
相关资源
最近更新 更多