📅  最后修改于: 2023-12-03 14:59:51.397000             🧑  作者: Mango
C++提供了两种类型的容器:序列容器和关联容器。这两种容器都实现了STL(Standard Template Library,标准模板库),并提供了众多的方法和操作,方便程序员进行数据存储和处理。下面分别对序列容器和关联容器进行介绍。
序列容器是一组容器类型,其中元素的顺序是由它们被插入的顺序决定的。序列容器支持随机访问,并且还支持在任何位置进行插入和删除操作。常用的序列容器有vector
、list
、deque
和array
。
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
是一个双向链表,与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
是一个双端队列,与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
是一个静态数组,必须在编译时指定大小。它支持像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;
}
关联容器是一组容器类型,其中元素是按照某个关键字来进行排序和访问的。关联容器提供了快速的查找、插入和删除操作。常用的关联容器有set
、map
、multiset
和multimap
。
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
的示例代码:
#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
的示例代码:
#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
的示例代码:
#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++的序列容器和关联容器都非常实用,可以让程序员高效地进行数据存储和处理。通过掌握它们的使用方法,可以使程序更加优雅、高效。