📜  C++ STL 中的集合数组(1)

📅  最后修改于: 2023-12-03 14:59:45.391000             🧑  作者: Mango

C++ STL 中的集合数组

在 C++ STL 中,有很多容器可以用来存储数据。其中,集合和数组是两种最常用的容器之一。在本文中,我们将会简要介绍这两种容器。

集合

集合是一种不允许重复元素的容器。C++ STL 提供了两种集合:set 和 unordered_set。

set

set 是一种基于红黑树实现的有序集合。

定义

可以如下定义一个 set:

#include <set>

std::set<int> s;  // 定义一个空的 set

插入元素

插入元素可以使用 insert() 方法:

// 插入一个元素
s.insert(42); 

// 向 set 中插入多个元素
s.insert({1, 2, 3, 4, 5});

删除元素

删除元素使用 erase() 方法:

// 删除一个元素
s.erase(42);

// 删除一个范围内的元素
s.erase(s.begin(), s.end());

遍历集合

使用迭代器进行遍历:

for (auto it = s.begin(); it != s.end(); ++it) {
  std::cout << *it << " ";
}

Set 的特性

set 的一些特性:

  1. set 中元素不可重复。
  2. set 中的元素默认按照升序排列。
  3. set 由红黑树实现,插入、删除、查询的时间复杂度均为 O(log n)。
unordered_set

unordered_set 是一种基于哈希表实现的无序集合。

定义

可以如下定义一个 unordered_set:

#include <unordered_set>

std::unordered_set<int> s;  // 定义一个空的 unordered_set

插入元素

插入元素可以使用 insert() 方法:

// 插入一个元素
s.insert(42); 

// 向 unordered_set 中插入多个元素
s.insert({1, 2, 3, 4, 5});

删除元素

删除元素使用 erase() 方法:

// 删除一个元素
s.erase(42);

// 删除一个范围内的元素
s.erase(s.begin(), s.end());

遍历集合

使用迭代器进行遍历:

for (auto it = s.begin(); it != s.end(); ++it) {
  std::cout << *it << " ";
}

unordered_set 的特性

unordered_set 的一些特性:

  1. unordered_set 中元素不可重复。
  2. unordered_set 中的元素没有特定的顺序。
  3. unordered_set 的底层实现是哈希表,插入、删除、查询的时间复杂度均为 O(1)。
数组

数组是一种可以容纳一组固定大小元素的容器。在 C++ STL 中,有两种数组:array 和 vector。

array

array 是一种用于存储固定大小元素的容器。与其他容器不同,array 中的元素数量是固定的。

定义

可以如下定义一个 array:

#include <array>

std::array<int, 5> a;  // 定义一个大小为 5 的空 array

插入元素

可以使用下标操作符 []:

a[0] = 42;
a[1] = 3;
a[2] = 14;
a[3] = 15;
a[4] = 92;

或者使用 at() 方法:

a.at(0) = 42;
a.at(1) = 3;
a.at(2) = 14;
a.at(3) = 15;
a.at(4) = 92;

删除元素

因为 array 中的元素数量是固定的,所以无法删除元素。

遍历数组

使用下标操作符或迭代器进行遍历:

for (int i = 0; i < a.size(); ++i) {
  std::cout << a[i] << " ";
}

for (auto it = a.begin(); it != a.end(); ++it) {
  std::cout << *it << " ";
}

for (int& x : a) {
  std::cout << x << " ";
}

array 的特性

array 的一些特性:

  1. array 的大小固定,无法插入或删除元素。
  2. array 可以使用下标操作符或迭代器访问元素。
  3. array 的初始化可以是列表初始化或默认初始化。
vector

vector 是一种动态数组,可以容纳任意数量的元素。

定义

可以如下定义一个 vector:

#include <vector>

std::vector<int> v;  // 定义一个空的 vector

插入元素

可以使用 push_back() 方法:

v.push_back(42);
v.push_back(3);
v.push_back(14);
v.push_back(15);
v.push_back(92);

或者使用 insert() 方法:

v.insert(v.begin(), 42);    // 在起始位置插入一个元素
v.insert(v.end(), {1, 2, 3});   // 在末尾插入多个元素

删除元素

可以使用 pop_back() 方法:

v.pop_back();   // 删除最后一个元素

或者使用 erase() 方法:

v.erase(v.begin());     // 删除起始位置的元素
v.erase(v.begin() + 2);   // 删除偏移量为 2 的元素

遍历数组

使用下标操作符或迭代器进行遍历:

for (int i = 0; i < v.size(); ++i) {
  std::cout << v[i] << " ";
}

for (auto it = v.begin(); it != v.end(); ++it) {
  std::cout << *it << " ";
}

for (int& x : v) {
  std::cout << x << " ";
}

vector 的特性

vector 的一些特性:

  1. vector 的大小是动态的,可以随时插入或删除元素。
  2. vector 可以使用下标操作符或迭代器访问元素。
  3. vector 的底层实现是动态数组,插入、删除、查询的时间复杂度均为 O(1) 或 O(n)。
总结

在本文中,我们简要介绍了 C++ STL 中的集合和数组。集合是一种不允许重复元素的容器,有 set 和 unordered_set 两种实现;数组则是一种可以容纳固定或动态大小元素的容器,有 array 和 vector 两种实现。根据实际需要,可以选择合适的容器来存储数据。