如何在C函数中使用std::向量

How to use a std::vector in a C function

本文关键字:std 向量 函数      更新时间:2023-10-16

C函数期望一个缓冲区数组在运行时处于作用域中。例如

char values[x][y]

C函数将填充缓冲区
我想使用动态数组,这样我就不必对维度进行硬编码
在这种情况下,如何使用std::矢量?

需要明确的是,我使用的是C++。C函数包含在我无法修改的库中。

如果只想将封装在std::vector中的动态数组传递给c例程,可以将指向底层数组头部的指针传递为:

std::vector<char> myvector;
// size-up myvector as needed
foo(&myvector[0]); // pass a pointer to start of myvector to function foo

c++标准确保std::vector中的底层数组始终是连续的。

希望这能有所帮助。

EDIT:虽然声明char values[x][y]创建了一个"数组数组",但values的内存实际上只是一个连续块,本质上是char linear_values[x * y]

如果您将std::vector的大小调整为包含x * y元素的计数,那么它应该会为您提供相同的底层动态分配的数组空间。

c函数将按行主顺序访问数组,因此第一行元素将排在第一位,然后是第二整行等。

C没有标准的数据结构库。

如果你真的想要一个向量的所有功能,而对于一些关键的东西,它是而不是,你可能会在网上找到某人喜欢的直接C向量的实现,并使用它。

如果是关键性的,请编写自己的。它不太难,而且非常有用。

如果您只想要一个动态增长的数组,那么使用realloc函数可以很容易地模拟向量的行为,该函数扩展了堆分配数组的维度。从一个小数组开始,到最后根据需要增长。大块增长更有效,但如果你对数据的外观有一些了解,你可以用不同的方式增长。一种常见的方法是每次用完时将数组大小加倍。

您可以在以下位置获取realloc的详细信息:

http://www.cplusplus.com/reference/clibrary/cstdlib/realloc/

或者,在*nix系统上:

man realloc

你不能。

根据定义,C对std::vector所需的任何组件一无所知,包括但不限于:

  • C没有名称空间,因此无法理解std名称空间。

  • C没有模板,因此无法理解std::vector<T>类型。

本质上,您需要看起来像的C函数,但就所有意图和目的而言,这是一个C++函数。

实现这一点的最简单方法可能是使用C++编写一个看起来像C函数的东西,并通过C++编译器而不是C编译器运行整个混乱。