【问题标题】:Creating a vector<int> reference to an integer array pointer (C++)创建对整数数组指针的 vector<int> 引用 (C++)
【发布时间】:2020-02-22 06:10:34
【问题描述】:

我的目标是获取 3 个标准整数数组并使用向量方法来操作它们,而不必将所有数组元素复制到单独的向量数组中。

我想这样做而不复制数组元素的原因是因为这些将是非常大的数组并且效率是优先考虑的。

以下是我想要的两个示例:

  1. 最简单的例子:
int arr[10000];
int *ptr;
std::vector<int> & v = ptr;
v.push_back(10);
  1. 函数示例:
// Function that inputs 3 integer arrays and creates pointers to them.
void use_vector(int *dst, int *src1, int *src2) {

  //creates vector references (without copying the original array elements)
  std::vector<int> & v_dst = dst;
  std::vector<int> & v_src1 = src1;
  std::vector<int> & v_src2 = src2;

  // do something using vector methods:
  v_dst.push_back( v_scr1.size() + v_scr2.size() );
}

在这两种情况下,我都会收到以下错误消息:

error: invalid initialization of reference of type ‘std::vector<int>&’ from expression of type ‘int*’
   std::vector<int> &v = ptr;

理想情况下,向量是引用(std::vector &),但如果无法引用,它们也可以是指针(std::vector *)。

【问题讨论】:

  • C++20 将有 std::span 处理这类事情。
  • "我的目标是获取 3 个标准整数数组并使用向量方法来操作它们,而无需将所有数组元素复制到单独的向量数组中。" - 赢了不行。 std::vector 需要它自己的元素副本。
  • 你能解释一下这些例子的效果吗?对于 c 数组,没有(明显的)向量 push_back 等效
  • @foreknownas_463035818 我给出的例子是故意简单的。我将需要使用向量类中的许多方法,因此尝试查找 c 数组等价是没有用的。
  • 可能是个误会。我认为这些例子并不简单。您希望 push_back 对您示例中的 c 数组做什么?

标签: c++ arrays pointers vector reference


【解决方案1】:

你不能这样做:

std::vector<int> & v = ptr;

因为左侧是对std::vector&lt;int&gt; 的引用,而右侧是指向int 的指针。

第二个例子也是如此。

此外,您基本上不能在现有阵列上使用std::vector。通常的方法是复制,你说你不想这样做。定义您自己的 class 的左侧确实为您提供了您想要的就地数组上的类似矢量的界面。

【讨论】:

  • 你认为我可以通过使用 SWIG 解决这个问题吗?为了提供更多的上下文,我实际上是在尝试使用 SWIG 将 numpy 数组转换为矢量引用,但是在遇到很多困难之后,我试图看看是否可以将 numpy 数组转换为 int * (我可以)然后在我的 .cpp 文件中使用 vector& 引用 int *。
  • 不,std::vector 在后台为您管理内存。即使您以某种方式将数组放入std::vector,对push_back 的调用也可能导致重新分配。想想你真正想要什么,然后写一个class,在它的构造函数中使用一个就地数组。
【解决方案2】:

您不能这样做,因为 std::vector 的设计对其拥有的数据具有所有权语义。

这意味着它不是为包装一个值数组并存储它而设计的。它必须拥有数据,因此需要一个副本(或从另一个 std::vector 移动)。

【讨论】:

  • 你认为我可以通过使用 SWIG 解决这个问题吗?为了提供更多的上下文,我实际上是在尝试使用 SWIG 将 numpy 数组转换为矢量引用,但是在遇到很多困难之后,我试图看看我是否可以将 numpy 数组转换为 int * (我可以)然后在我的 .cpp 文件中使用 vector& 引用 int *。
  • 为什么首先需要这样做?您需要支持哪种操作?大多数操作都是在 STL 中的迭代器上完成的,不需要 std::vector,因为 int* 就足够了。
  • 除了添加元素和动态分配内存的标准化便利性之外,我没有关于为什么需要向量的所有信息。我将研究 STL 中的迭代器,看看它是否满足所有要求。谢谢!
  • 您是否意识到让std::vector 管理内存会使它在重新分配时失效?至少可以说。你以前的指针会失效。
猜你喜欢
  • 2011-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-16
  • 2014-11-26
相关资源
最近更新 更多