C++ STL 中 deque::assign 和 deque::at 之间的区别

2025年5月10日 | 阅读 8 分钟

双端队列(deque)是序列容器,可以在两端增长和收缩。它们类似于 vector,但在元素添加到开头或结尾时效率更高。与 vector 不同,它们不总是保证连续存储分配。在本文中,我们将讨论 C++ 中 deque::assigndeque::at 之间的区别。在讨论它们之间的区别之前,我们必须了解 C++ 中 deque::assign 和 deque::at 的语法、参数和示例。

C++ 中的 deque::assign 是什么?

成员函数 deque::assign 根据需要调整 std::deque 的大小,并替换其所有元素的当前内容。在删除之前的元素后,deque 会用来自范围、初始化列表或指定计数重复值的指定值填充。此函数在一步中重新初始化 deque 的内容时特别有用。与直接赋值不同,赋值时 deque 的大小保证与提供的数据匹配。它修改整个结构,而不是检查 deque 的边界。

语法

它具有以下语法:

目的:使用此函数可以替换 deque 的当前内容并调整其大小。

功能

  • 它会删除 deque 的所有当前元素。
  • 它根据提供的参数添加其他元素。
  • 它会调整 deque 的大小以适应更新后的内容。

重载有

  • 提供一系列元素: (first, last)
  • 分配重复值: (count, value) assign
  • 指定初始化列表: assign({value1, value2,...})

示例

让我们通过一个例子来说明 C++ 中的 deque::assign

deque::at 是什么?

deque::at 函数使用这些函数在执行边界检查的同时访问或修改 std::deque 中特定索引处的元素。通过在指定的索引超出范围时抛出 std::out_of_range 异常,它可以确保元素的访问是安全的。该函数不会改变 deque 的大小或结构,它只修改已存在的对象。它可用于读取和修改值。它非常适合无法保证索引有效性的情况,因为与下标运算符 ([]) 相比,它提供了更高的安全性,因为它进行了边界检查。

语法

它具有以下语法:

目的:它提供对给定索引处元素的边界检查访问。

功能

  • 它返回对位于指定位置的元素的引用。
  • 如果索引无效,它将抛出 std::out_of_range 异常。

使用

  • 它允许在指定位置读取和修改元素。

示例

让我们通过一个例子来说明 C++ 中的 deque::at。

C++ 中 deque::assign 和 deque::at 之间的主要区别

Difference between deque::assign and deque::at in C++

C++ 中 deque::assigndeque::at 之间存在一些主要区别。一些主要区别如下:

方面Deque::assignDeque::at
定义此方法使用新内容替换 deque 容器的当前内容。它用于返回对 deque 容器对象索引为 n 的元素的引用。
目的它向 deque 添加新元素并替换其所有部分。它修改或访问特定索引处的元素。
效果更改所有现有元素并调整 deque 的大小。它不对 deque 的大小或结构产生影响。
参数它接受初始化列表、范围或计数-值对作为输入。只接受一个索引作为参数。
Exception在正常情况下,它不会抛出异常。如果索引无效,将抛出 std::out_of_range。
修改它替换 deque 中的每个元素。它只与一个元素交互。
典型用法重置或重新初始化 deque 的内容。安全地访问或修改单个元素。
边界检查不适用(替换内容)。它通过执行边界检查来确保安全访问。
影响它重新初始化 deque 并可能改变其大小。仅读取或修改已存在的元素。
复杂度它的复杂度是线性的。它从不变得更简单。
返回值它没有返回类型。它返回对指定位置元素的引用。

示例用法

示例 1

让我们通过一个例子来说明 C++ 中的 deque::assign 和 deque::at。

输出

 
Deque after assign: 10 10 10 10 10 
Deque after reassigning from initializer list: 1 2 3 4 5 
Element at index 2: 3
Deque after modifying index 2: 1 2 99 4 5 
Accessing out-of-bounds index: Exception: deque::_M_range_check: __n (which is 10)>= this->size() (which is 5)   

说明

  • 首先,使用初始化列表中的元素替换 deque 的内容,或分配指定数量的元素。
  • 然后,使 deque 调整大小以适应更新后的数据。
  • 安全地修改或访问特定元素。
  • 如果提供的索引无效,将抛出异常。

示例 2

让我们通过另一个例子来说明 C++ 中的 deque::assign 和 deque::at。

输出

 
Deque after assign with count and value: Hello Hello Hello 
Deque after assign with initializer list: Welcome to C++ Programming 
Element at index 1: to
Deque after modifying element at index 2: Welcome to Modern Programming 
Accessing out-of-bounds index: Exception: deque::_M_range_check: __n (which is 10)>= this->size() (which is 4)   

说明

  • 第一个 assign 调用创建三个值为“Hello”的元素。
  • 第二次 assign 用初始化列表中的字符串集替换了整个 deque 内容。
  • 访问有效索引处的特定元素并修改它们。
  • 为防止无效索引访问而引发异常,以确保安全。

示例 3

让我们通过另一个例子来说明 C++ 中的 deque::assign 和 deque::at。

输出

 
Deque after assign (4 elements of value 7): 7 7 7 7 
Deque after assigning from array range: 10 20 30 
Value at index 1: 20
Deque after modifying index 1: 10 25 30 
Accessing element at index 5: Exception: deque::_M_range_check: __n (which is 5)>= this->size() (which is 3)   

说明

  • 最初,将值 7 分配给 4 个元素。
  • 然后,deque 被数组的前三个条目替换。
  • 安全地更改索引 1 处元素的值。
  • 当尝试访问超出范围的索引 (5) 时,会引发异常。

结论

在 C++ 中,deque::atdeque::assign 在处理和交互 std::deque 元素方面具有不同的目的。由于 assign 函数是为批量操作而设计的,我们可以通过使用来自范围、重复值或初始化列表的新数据来重新初始化 deque,从而扩展和替换 deque 中的每个元素。但是,它通过边界检查提供精确的访问来提供安全的值检索或修改。通过为越界访问分配异常,并在保持 deque 大小不变的同时修改 deque 的完整结构,可以实现更安全的数据元素管理。了解它们之间的区别可以确保 std::deque 针对特定用例(例如重新初始化内容或安全地访问单个元素)尽可能有效地使用。


下一个主题C++ 中的割线法