函数中无效常量 * 参数的目的
Purpose of void const * argument in function
我正在尝试使用 VLFeat 的库函数,该函数要求数据为常量空 *。我真的不明白如何创建数据然后将其传入。
这是函数调用:
void vl_kmeans_init_centers_with_rand_data (VlKMeans * self, void const * data,
vl_size dimension, vl_size numData, vl_size numCenters)
数据参数是抛出我的参数。我尝试构建一个随机数据矩阵来测试 kmeans 聚类函数,但我无法弄清楚如何使用这些数据。换句话说,此函数需要此参数。但是为了有用,我必须了解如何转换/创建/加载数据以使其工作。这意味着,我需要了解参数中const void *
类型的目的。
任何帮助将不胜感激。
注意:我确实理解 const 的含义,但是,例如,我无法弄清楚如何迭代构建 const 数据(即用双 for 循环填充矩阵)
谢谢!
const
,尽管标准化委员会尽了最大努力来混淆您,但并不意味着"恒定"。它的意思是"只读"。
通过将其参数声明为指向const
的指针,此函数声明您的数据不会在传入过程中被复制,但该函数的代码只能读取它,而不能修改它。
因此,只需以常规方式构建矩阵(非const
,因为您需要使用循环完成它),并将其传入,确信它将返回不变。
除非。。。函数的代码丢弃了常量。这应该让写它的人立即被解雇。
const
仅表示不允许vl_kmeans_init_centers_with_rand_data
修改该数据。 即您不必使用 const
数组,您可以传递一个"正常"(可变)数组。 const
始终可以通过隐式转换添加 - 只是不是相反。
(允许添加 const:一个函数可能总是承诺不修改对象,即使它可以被修改。不允许删除 const:如果原始函数在承诺不会修改对象的情况下被赋予了对象,则函数不得修改对象,或将其提供给另一个需要可修改对象的函数。
void
,当用作指针的类型时,表示"任何内容"。 也就是说,您可以将 int 指针转换为 void 指针,将双指针转换为 void-pointer - 任何你喜欢的指针都指向 void-pointer。这样做的原因是,大多数时候,采用 void-pointer 参数的函数可以处理不同的数据类型。在这种情况下,VlKMeans
有一个成员dataType
,该成员可能控制 vl_kmeans_init_centers_with_rand_data
函数将如何解释data
参数。
假设例如 dataType
设置为 VL_TYPE_DOUBLE
,这应该可以工作:
std::vector<double> data(numData);
// fill 'data' with data
vl_kmeans_init_centers_with_rand_data(vlkMeans, &data[0], dimension, numData, numCenters);
- 如何创建长度由常量参数指定的数组
- 通过常量引用传递参数的矩阵模板类
- 具有常量引用参数的函数模板专用化
- 使用自动推导的 lambda 参数作为常量表达式
- C++:常量引用参数
- 常量参数"real"常量吗?
- 常量参数存储在哪里 (C++)?
- 常量函数,当其参数是对文字类型的引用时
- 区分接受常量参数的函数引用/指针和与函数参数同名的非常量参数
- 必须非常量别名参数及其默认参数常量
- 字符串参数常量字符* 和常量 wchar_t*
- 可选参数常量引用重新分配
- 推导模板化类参数的模板参数:常量问题
- 从函数参数常量字符串 (&) 设置值
- 为什么我必须声明这些引用参数常量或按值传递
- C++使用一个参数常量重载
- 如果要执行const_cast,为什么要制作参数常量?
- 模板非类型参数常量限制筛选器库
- 标记方法指针/引用参数常量真的会显著影响性能吗
- 当函数参数常量引用 T 时,为什么 T 的模板参数推导'skips'数组元素的恒定性?