C++ 中 deque::assign 和 deque::empty 的区别

17 Mar 2025 | 5 分钟阅读

双端队列(deque),或称双向队列,是序列容器,可在开头和结尾高效地插入和删除元素 (Cormen et al., 2009)。与向量(vector)非常相似,双端队列支持通过索引位置访问元素。然而,它们在几个关键方面有所不同。首先,向量保证其元素连续存储分配,而双端队列为了效率可能会非连续地分配存储 (Josuttis, 2012)。其次,双端队列的动态大小扩展和收缩针对两端操作进行了优化,而不仅仅是像向量那样只针对一端。Josuttis (2012) 指出,这使得双端队列在前端添加/删除时比向量更高效。最后,通过支持两端常数时间 O(1) 的插入和删除,双端队列同时在相同的数据结构中实现了先进先出(FIFO)的队列和后进先出(LIFO)的堆栈语义 (Cormen et al., 2009)。这种双端特性使得双端队列在需要从两个方向访问的算法中非常通用。

deque::assign() 方法为双端队列分配新内容,替换其现有元素。以下是其解释:

assign() 函数允许用其参数指定的新元素替换双端队列的所有元素。它会完全擦除双端队列的任何现有内容,并用提供的元素值的副本填充它。

语法是

其中

number: 要插入到双端队列中的元素副本的数量。决定新的大小。

value: 分配给这些数字元素的每个元素的值。所有元素都将是 value 的副本。

deque::assign

关于 assign() 的一些要点:

  • 它在赋值前会清除原始双端队列。
  • 双端队列的大小变为 'number'
  • 任何迭代器或指针,除了指向新赋值元素的那些,都可能失效。
  • 如果数量过大或内存分配失败,可能会引发 length_errorbad_alloc 异常。
  • assign() 函数一次性完全替换双端队列的内容非常有用。为新元素重新分配空间允许灵活地重用现有双端队列,而不是创建新的双端队列。

使用 deque::assign 的 C++ 程序。

让我们举一个例子来说明 deque::assign 在 C++ 中的使用。

输出

Elements of the deque after assign: 1 2 3 4 5
Elements of the deque after second assign: 100 100 100

复杂度

时间复杂度

  • std::deque::assign 的时间复杂度与提供的范围大小或指定元素数量呈线性关系。
  • 在两种情况下,时间复杂度都是 O(N) 其中 N 是已分配项目的数量。

空间复杂度

  • 空间复杂度是 O(N) 其中 N 是已赋值元素的数量。
  • 所需空间与分配的元素数量或提供的范围大小成正比。

deque::empty

deque::empty() 方法用于检查双端队列容器是否为空。

以下是关于 deque::empty() 的一些要点:

  • 它返回一个布尔值 - 如果双端队列为空则为 true,如果包含元素则为 false。
  • 这是一个常量操作,时间复杂度为 O(1)。检查是否为空速度很快。

用途

在访问元素之前使用 empty() 检查空状态可以防止不必要的段错误和错误。

它比将 deque.size()0 进行比较更高效。它不遍历和计数;只检查一个内部标志。

它适用于任何类型的双端队列容器,例如内置类型、自定义对象等的双端队列。

总而言之,deque::empty() 用于在访问元素之前高效地检查双端队列是否为空,从而防止潜在的错误。

语法

它具有以下语法:

参数

count - 要插入的元素数量。

value - 要分配给元素的值。

头文件

迭代器有效性

指向双端队列元素的迭代器和引用仍然有效,除了那些指向“被assign替换”的元素。

异常

它抛出 std::length_error 和 std::bad_alloc 异常

std::length_error - 如果 count > max_size()

std::bad_alloc - 如果内存分配失败

进一步解释,deque::assign() 函数用 count 份 value 参数的副本替换当前双端队列内容。在此过程中,双端队列的所有先前元素都将被删除。

指向被替换元素的任何迭代器或元素引用都将失效,而其余的即使在 assign() 操作之后仍然有效。通过完全替换现有双端队列的内容,重用它很有用。

使用 deque::empty 的 C++ 程序

让我们举一个例子来说明 deque::empty 在 C++ 中的使用。

输出

Deque is empty.
Deque is not empty.

复杂度

时间复杂度

  • std::deque::empty 的时间复杂度是 O(1)。
  • 检查双端队列是否为空是一个常数时间操作。

空间复杂度

  • 空间复杂度是 O(1)
  • 该函数不需要与双端队列大小成比例的额外空间;它只返回一个布尔结果。

deque::assign 和 deque::empty 之间的区别

Difference Between deque::assign and deque::empty in C++

以下是 deque::assign() 和 deque::empty() 之间主要区别的表格比较

特性deque::assign()deque::empty()
目的它通过替换现有元素来分配新元素。检查双端队列容器是否为空
参数(count, value)
返回值无 (void)bool
时间复杂度线性 O(n)常数 O(1)
对双端队列的影响擦除原始内容,调整双端队列大小无,只检查
迭代器有效性使指向被替换元素的迭代器失效无影响
异常可能抛出 length_error, bad_alloc
用途完全替换双端队列内容访问前检查是否为空

总之,主要区别在于

  • assign() 通过分配新元素来替换整个双端队列。
  • empty() 只是检查当前是否为空。
  • assign() 先清除双端队列,而 empty() 不修改。
  • assign() 导致重新分配,empty() 只检查一个标志。

因此,assign() 完全改变了双端队列,而 empty() 允许您检查当前状态而不进行任何修改。