如何在C函数中使用std::向量
How to use a std::vector in a C function
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编译器运行整个混乱。
- std::向量与传递值的动态数组
- 如何在旧c++中初始化const-std向量
- 如何检查两个 std::向量在小于 O(n) 的时间复杂度内是否相等
- 当键值是 std 向量时,为什么使用 at in C++ 访问映射值如此缓慢?
- 如何初始化 std::向量的映射?
- 迭代时将指向differents类型的指针保存在std::向量中
- std::向量迭代器和调整大小/保留的奇怪/有趣行为
- yaml-cpp到std::向量迭代的怪异行为
- 故意泄漏std::向量的内存
- 调整STD ::向量的大小是否可以降低其能力
- std ::向量距离函数如何给出比.size()更高的值
- C++ std::向量插入两个元素替代算法失败
- 错误:数字常数之前的预期无限制ID:std :: array和std ::向量大小分配
- 在我提供的此示例中,如何将2维std ::向量的逻辑更改为具有向量[row] [col] [col] [col] [co
- GUI滑块的动态数量,该数量更新具有回调中值的std ::向量
- 是一个std ::向量线程,我的目的是安全的
- 将具有std ::向量的C 函数称为Julia的输入和输出参数
- 将std ::向量作为指针参考
- STD ::向量如何调整其内部缓冲区大小
- 在C 中,是否有可能在不兼容类型的std ::向量对象之间传输不同类型的缓冲区