尝试 Push Multiple 和 Pop 元素

本页将介绍如何对指定 Vector 对象实例进行元素的 Push Multiple & Pop 操作

什么是 Push Multiple?

Push Multiple 是 Push 的一种扩展特性,皆在提供 Push 的批量操作。

为什么需要 Push Multiple?

通常情况下,若我们需要向指定 Vector 对象实例 Push 多个元素时,可能会进行多次 Push 操作,也即多次调用 vector_helper_push_element 函数。这不仅会带来函数调用方面的性能开销,也会使函数 vector_helper_push_element 的多数内部代码逻辑多次无意义的重复执行,这无疑会降低应用程序的执行性能。

与此同时,若我们需要确保每一个元素被成功 Push 进指定 Vector 对象实例,还需要对每次调用 vector_helper_push_element 函数的返回值进行判断,从而可能导致垃圾代码的产生,也会进而影响应用程序的执行性能。

综合上述两点来看,若我们使用 Push Multiple 特性,问题则迎刃而解。因为 Push Multiple 特性采用一次性函数调用提交,因此不存在多次函数调用带来的性能开销。并且,Push Multiple 特性会确保本次操作的完整性,遵循单个元素 Push 失败则全部失败,因此也不会存在对每次调用 vector_helper_push_element 函数的返回值进行判断的代码逻辑所带来的垃圾代码与性能开销。

如何使用 Push Multiple?

假定我们有 10 个待 Push 的 int 元素,我们将其放置在 int 数组变量 element_values 中:

C
int element_values[10] = {10, 20, 30, 40, 50, 60, 70, 80, 90, 100};

接下来,我们调用 vector_helper_push_multiple_element 函数将 int 数组变量 element_values 中的元素,一次性 Push 进 Vector 对象实例 vector_object 中。

C
size_t push_element_index = 0; // 用于接收 Push 的多个元素中首个元素的索引号
if(!vector_helper_push_multiple_element(vector_object, element_values,
sizeof(element_values[0]), sizeof(element_values) / sizeof(element_values[0]),
&push_element_index))
{
// Push Multiple 失败,所有元素均未被 Push。
printf("main -> vector_helper_push_multiple_element error\n");
}

现在,我们已将 int 数组变量 element_values 中的 10 个 int 元素成功 Push 进了 Vector 对象实例 vector_object 中。

您是否还记得 Reserve & Handover 特性?Push Multiple 特性中之所以可以确保本次操作的完整性,就是因为使用了 Reserve & Handover 特性。

在上面示例代码中,调用的 vector_helper_push_multiple_element 函数的详细介绍,您可以在 Vector Helper API 分类中“元素的存取与管理”页面找到:

什么是 Pop?

Pop 与 Push 是相反的,Push 是将一个或多个元素推入到指定 Vector 对象实例的尾部,而 Pop 则是从指定 Vector 对象实例的顶部弹出一个元素。而 Push & Pop 则实现了一个先进先出有序队列的基本操作。

Pop 是如何实现的?

实际上,Pop 是 Get 和 Remove 的组合实现,首先通过调用 vector_helper_get_element 函数获取第 0 个元素的值,再调用 vector_helper_remove_element 函数从第 0 个元素开始移除 1 个元素。

如何使用 Pop?

首先,我们向 Vector 对象实例 vector_object 中 Push 1 个元素,以便我们进行 Pop:

C
int element_value = 10;
vector_helper_push_element(vector_object, &element_value,
sizeof(element_value), NULL);

然后,我们通过调用 vector_helper_pop_element 函数从 Vector 对象实例的顶部弹出一个元素,然后打印输出被弹出元素的值:

C
if(vector_helper_pop_element(vector_object, &element_value, sizeof(element_value)))
{
printf("pop element value = %d\n", element_value);
}

现在,若函数 vector_helper_pop_element 成功,则我们会在 Shell 中看到如下输出:

Shell
pop element value = 10

一个高性能有序队列应尽量避免使用 Vector HelperPush & Pop 来实现,因为 Pop 操作涉及到从指定 Vector 对象实例的顶部 Remove 元素,而从顶部进行 Remove 操作会要求重新运行内存分配器,从而影响应用程序的执行性能。

在上面示例代码中调用的 vector_helper_pop_element 函数的详细介绍,您可以在 Vector Helper API 分类中的“元素存取与管理”页面中找到: