bitset 接口
set
all bits (1) bitset& set() noexcept;single bit (2) bitset& set (size_t pos, bool val = true);用于序列中的一位或所有位设置为1。
bitset& set() noexcept;
这个版本将位序列中的所有位都设为1。
bitset& set(size_t pos, bool val = true);
这个版本能够设置位序列中的指定位。参数pos
为我们想要设置的位的位置,参数val
是设定的值,如果不提供val
参数,默认将位设置为1。如果提供了val
参数并且其值为false
,则将指定位设为0。
reset
用于重置(即设置为0)位序列中的一位或所有位。
all bits (1) bitset& reset() noexcept;single bit (2) bitset& reset (size_t pos);
1.重置所有位: 使用无参数版本的 reset 函数可以将位序列中的所有位都重置为0。
2.重置指定位: 使用带有位置参数的 reset 函数可以仅重置位序列中指定位置的位。
tset
bool test (size_t pos) const;用于检查位序列中指定位置的位是否被设置为1。如果指定位置的位是1,则返回
true
,如果是0,则返回false
。
pos
: 要检查的位的位置。请注意,如果传入的位置
pos
超出了bitset
的大小,这个函数会抛出std::out_of_range
异常。
array(C++11)
array是一种容器,它封装了固定大小的数组。
array的[ ]相比C的静态数组,能更严格的检查数组越界
std::array
提供的一些重要特性包括:
.size()
: 返回数组的大小(元素数量)。.at(index)
: 返回数组中指定位置的元素,带有越界检查。.front()
: 返回数组中的第一个元素。.back()
: 返回数组中的最后一个元素。.data()
: 返回一个指向数组首元素的指针。
forward(C++11)
它表示一个单向链表
与 std::list
相比,std::forward_list
由于没有维护双向序列,因此使用的内存更少。
一些基本的 std::forward_list
操作包括:
- 初始化: 可以通过一个初始化列表来初始化
std::forward_list
。
#include <forward_list>std::forward_list<int> myList = {1, 2, 3, 4, 5};
- 添加元素: 使用
push_front
在链表的开始位置添加元素。
myList.push_front(0);
- 访问元素:
std::forward_list
没有直接通过索引访问元素的方法。要访问元素,通常需要遍历列表。
for (auto &element : myList) {// 使用 element
}
- 删除元素: 使用
erase_after
根据迭代器位置删除元素。
myList.erase_after(myList.before_begin()); // 删除第一个元素
请注意, std::forward_list
没有提供随机访问的功能, 这意味着不能通过索引来直接访问或修改元素。此外,std::forward_list
通常用于特定的场景,例如当你需要频繁地在链表前面插入或删除元素时,它可以提供比 std::list
更好的性能。
deque(C++11)
它是一种序列容器,与 std::vector
类似,但提供了在序列前后两端高效插入和删除元素的能力。
主要特点
- 动态大小:与数组不同,
std::deque
可以根据需要动态增长或缩小。 - 随机访问:就像数组和
std::vector
,std::deque
支持快速随机访问,可以通过索引直接访问任何元素。 - 双端操作:可以在
std::deque
的前端和后端快速地插入和删除元素,这是std::deque
与std::vector
的主要区别,因为std::vector
在前端插入和删除元素时效率较低。
缺点
- 额外开销:由于底层使用了指针数组和多个数据块,
std::deque
比std::vector
有额外的内存开销。 - 非连续内存:虽然
std::deque
提供了类似连续内存的随机访问接口,但实际上它的元素可能分布在非连续的内存块中,这可能影响到它在数据局部性方面的表现。