📜  C++中的序列容器与关联容器(1)

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

C++中的序列容器与关联容器

C++提供了两种类型的容器:序列容器和关联容器。这两种容器都实现了STL(Standard Template Library,标准模板库),并提供了众多的方法和操作,方便程序员进行数据存储和处理。下面分别对序列容器和关联容器进行介绍。

序列容器

序列容器是一组容器类型,其中元素的顺序是由它们被插入的顺序决定的。序列容器支持随机访问,并且还支持在任何位置进行插入和删除操作。常用的序列容器有vectorlistdequearray

vector

vector是一个动态数组,可以在运行时调整大小。它支持快速随机访问和在末尾进行插入和删除操作。以下是使用vector的示例代码:

#include <vector>
#include <iostream>

int main() {
  // 创建一个包含三个元素的vector
  std::vector<int> v = {1, 2, 3};

  // 在vector末尾插入一个元素
  v.push_back(4);

  // 像使用数组一样访问vector中的元素
  for (int i = 0; i < v.size(); ++i) {
    std::cout << v[i] << " ";
  }
  std::cout << std::endl;

  return 0;
}
list

list是一个双向链表,与vector不同,它不能在随机位置进行快速随机访问。但是,它支持在任何位置进行快速插入和删除操作。以下是使用list的示例代码:

#include <list>
#include <iostream>

int main() {
  // 创建一个包含三个元素的list
  std::list<int> l = {1, 2, 3};

  // 在list末尾插入一个元素
  l.push_back(4);

  // 在list前面插入一个元素
  l.push_front(0);

  // 使用迭代器遍历list中的元素
  for (auto it = l.begin(); it != l.end(); ++it) {
    std::cout << *it << " ";
  }
  std::cout << std::endl;

  return 0;
}
deque

deque是一个双端队列,与vector类似,它可以在随机位置进行快速随机访问。但是,与vector不同的是,它还支持在两端进行快速插入和删除操作。以下是使用deque的示例代码:

#include <deque>
#include <iostream>

int main() {
  // 创建一个包含三个元素的deque
  std::deque<int> d = {1, 2, 3};

  // 在deque前面插入一个元素
  d.push_front(0);

  // 在deque末尾插入一个元素
  d.push_back(4);

  // 像使用数组一样访问deque中的元素
  for (int i = 0; i < d.size(); ++i) {
    std::cout << d[i] << " ";
  }
  std::cout << std::endl;

  return 0;
}
array

array是一个静态数组,必须在编译时指定大小。它支持像vector一样的随机访问,但不支持在中间插入和删除操作。以下是使用array的示例代码:

#include <array>
#include <iostream>

int main() {
  // 创建一个包含三个元素的array
  std::array<int, 3> a = {1, 2, 3};

  // 像使用数组一样访问array中的元素
  for (int i = 0; i < a.size(); ++i) {
    std::cout << a[i] << " ";
  }
  std::cout << std::endl;

  return 0;
}
关联容器

关联容器是一组容器类型,其中元素是按照某个关键字来进行排序和访问的。关联容器提供了快速的查找、插入和删除操作。常用的关联容器有setmapmultisetmultimap

set

set是一个排序的容器,其中所有的元素都是唯一的。它支持快速查询、插入和删除操作。以下是使用set的示例代码:

#include <set>
#include <iostream>

int main() {
  // 创建一个set
  std::set<int> s = {2, 3, 1};

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

  // 查找set中是否存在一个元素
  auto it = s.find(3);
  if (it != s.end()) {
    std::cout << "Found " << *it << std::endl;
  }

  // 使用迭代器遍历set中的元素
  for (auto it = s.begin(); it != s.end(); ++it) {
    std::cout << *it << " ";
  }
  std::cout << std::endl;

  return 0;
}
map

map是一个排序的容器,其中所有的元素都是由键和值组成的键值对,键是唯一的。它支持快速查询、插入和删除操作。以下是使用map的示例代码:

#include <map>
#include <iostream>

int main() {
  // 创建一个map
  std::map<char, int> m = {{'b', 2}, {'a', 1}, {'c', 3}};

  // 插入一个键值对
  m.insert({'d', 4});

  // 查找map中是否存在一个键
  auto it = m.find('c');
  if (it != m.end()) {
    std::cout << "Found " << it->second << std::endl;
  }

  // 使用迭代器遍历map中的键值对
  for (auto it = m.begin(); it != m.end(); ++it) {
    std::cout << it->first << ":" << it->second << " ";
  }
  std::cout << std::endl;

  return 0;
}
multiset

multiset是一个排序的容器,其中所有的元素都是唯一的,但是可以有多个相同的元素。它支持快速查询、插入和删除操作。以下是使用multiset的示例代码:

#include <set>
#include <iostream>

int main() {
  // 创建一个multiset
  std::multiset<int> ms = {2, 3, 1, 3};

  // 插入一个元素
  ms.insert(4);

  // 查找multiset中是否存在一个元素
  auto it = ms.find(3);
  if (it != ms.end()) {
    std::cout << "Found " << *it << std::endl;
  }

  // 使用迭代器遍历multiset中的元素
  for (auto it = ms.begin(); it != ms.end(); ++it) {
    std::cout << *it << " ";
  }
  std::cout << std::endl;

  return 0;
}
multimap

multimap是一个排序的容器,其中所有的元素都是由键和值组成的键值对,键可以有多个相同的元素。它支持快速查询、插入和删除操作。以下是使用multimap的示例代码:

#include <map>
#include <iostream>

int main() {
  // 创建一个multimap
  std::multimap<char, int> mm = {{'b', 2}, {'a', 1}, {'c', 3}, {'a', 4}};

  // 插入一个键值对
  mm.insert({'d', 4});

  // 查找multimap中是否存在一个键
  auto it = mm.find('a');
  if (it != mm.end()) {
    std::cout << "Found " << it->second << std::endl;
  }

  // 使用迭代器遍历multimap中的键值对
  for (auto it = mm.begin(); it != mm.end(); ++it) {
    std::cout << it->first << ":" << it->second << " ";
  }
  std::cout << std::endl;

  return 0;
}

总之,C++的序列容器和关联容器都非常实用,可以让程序员高效地进行数据存储和处理。通过掌握它们的使用方法,可以使程序更加优雅、高效。