尝试 Set & Get 元素

本页将介绍如何向指定 Vector 对象实例进行元素的 Set & Get 操作

前提条件

首先,我们需要创建一个 Vector 对象实例,然后 push 一个元素,以便进行元素的 set & get 操作。

C
Vector vector_object = vector_helper_create_object(sizeof(int), 1, 99);
if(vector_object)
{
int element_value = 0;
size_t push_element_index = 0;
vector_helper_push_element(vector_object, &element_value,
sizeof(element_value), &push_element_index);
// ...
vector_helper_destroy_object(vector_object);
}

尝试 Set 元素

已知元素索引号位于 push_element_index 变量,现在我们尝试设置(重写)该元素的值:

C
element_value = 10;
vector_helper_set_element(vector_object, push_element_index, &element_value,
sizeof(element_value));

现在,我们已经调用 vector_helper_set_element函数设置元素 push_element_index的值为变量 element_value的值。

函数 vector_helper_set_element 的返回值类型为 bool,若设置指定元素的值失败,则返回 false,反之返回 true。通常情况下,建议您检查该函数的返回值。

尝试 Get 元素

我们刚才已经设置元素 push_element_index 的值为变量 element_value 的值,现在我们尝试获取该值:

C
int get_element_value = 0;
vector_helper_get_element(vector_object, push_element_index,
&get_element_value, sizeof(get_element_value));

现在我们已经通过调用 vector_helper_get_element 函数获取元素 push_element_index的值并存入 get_element_value 变量。

函数 vector_helper_get_element 的返回值类型为 bool,若获取指定元素的值成功返回 true,反之返回 false。通常情况下,建议您检查该函数的返回值。而不是忽略返回值直接使用 get_element_value 变量。

尝试 Unsafe Get 元素

为了降低对元素读取性能的影响,Vector Helper 内置了一个 Unsafe 函数 vector_helper_get_element_value。该函数在调用时仅简单的对调用参数进行检查并返回指定元素位于 Vector 对象实例中的 void* 内存指针。

除非必要,否则您不应该使用 vector_helper_get_element_value 函数。因为这是一个 Unsafe 函数,使用此函数时无法确保元素和缓冲区的完整性。您应该使用 vector_helper_get_element 函数来获取指定元素的值。

C
int get_element_value = *(int*)vector_helper_get_element_value(vector_object,
push_element_index); // unsafe

现在我们已经通过调用 vector_helper_get_element_value 函数获取元素 push_element_index的值并赋值给 get_element_value变量。

根据上述代码逻辑,我们尝试对函数 vector_helper_get_element_value 所返回的 void* 指针进行强制类型转换为 int* 并对 int* 进行内存读取,从而赋值给变量 get_element_value。而在这些过程中,无法确保该函数会返回无效指针,进而导致承载当前模块的进程实例崩溃。当然,您可以尝试对该函数返回的指针进行有效性检查,但也会因此影响性能。

若您坚持使用此函数,建议您遍历或仅读取元素的值时,将指针变量使用 const 关键字限定。

该函数使用预处理器条件编译选项 VECTOR_ALLOW_UNSAFE_FUNCTION,该条件编译选项是默认启用的。当该选项为启用状态时,函数 vector_helper_get_element_value 以及其他 Unsafe 函数、数据类型、宏才会被编译。

相关 Vector Helper API 的详细介绍