一.容器的介绍
-
map
:是关联容器,它存储的是键值对(key-value)形式的数据,其中每个元素都由一个唯一的键和一个值组成。键是按照严格弱序进行排序的,因此可以快速地根据键进行查找。键是唯一的,即不允许重复的键。 -
set
:也是关联容器,存储的是唯一的键,而没有值。它内部会自动对元素进行排序,并且保证元素是唯一的。可以高效地进行查找和插入操作。 -
unordered_map
:是关联容器,类似于map
,但它使用哈希表实现,不会对元素进行排序。因此,插入、删除和查找的平均时间复杂度为常数时间O(1)。它适用于需要快速查找的场景,但不需要对键进行排序。 -
multiset
:是关联容器,类似于set
,但允许存储重复的键。它内部会对元素进行排序,因此可以高效地进行查找和插入操作。 -
vector
:是动态数组,可以在尾部快速插入和删除元素。它的内存分配是连续的,支持随机访问,但在中间或开头进行插入和删除操作较慢。适用于需要频繁地进行随机访问的场景。 -
list
:是双向链表,可以在任意位置高效地插入和删除元素。它不支持随机访问,但对于大量的插入和删除操作,性能比vector
更好。 -
forward_list
:是单向链表,类似于list
,但只支持单向遍历和插入操作,删除操作相对较快。它的内存占用更小,适用于对内存要求较高的场景。
二.常用的容器方法
map
:map
通常使用红黑树实现,每个节点包含一个键和对应的值,根据键值进行排序。常用函数有:
map<int, string> myMap;
// 插入元素 myMap.insert(make_pair(1, "One"));
//遍历元素 for (const auto& pair : myMap) { std::cout << "Key: " << pair.first << ", Value: " << pair.second << std::endl; }
// 删除元素 myMap.erase(2);
// 查找元素 map<int, string>::iterator it = myMap.find(2);
// 检查键的次数 myMap.count(key)
set
:set
通常使用红黑树实现,每个节点只包含一个键,根据键值进行排序。常用函数有:
-
insert
:插入元素。erase
:删除元素。find
:查找元素。
-
unordered_map
:unordered_map
通常使用哈希表实现,每个节点包含一个键和对应的值,不会进行排序,可以高效地进行查找、插入和删除操作。常用函数有:insert
:插入元素。erase
:删除元素。find
:查找元素。operator[]
:通过键值访问元素。
-
multiset
:multiset
通常使用红黑树实现,每个节点包含一个键,允许存储重复的键,根据键值进行排序。常用函数与set
相同。 -
vector
:vector
通常使用动态数组实现,可以在尾部快速插入和删除元素。常用函数有:push_back
:在尾部插入元素。pop_back
:删除尾部元素。insert
:在指定位置插入元素。erase
:删除指定位置的元素。size
:返回元素个数。operator[]
:通过下标访问元素。
-
list
:list
通常使用双向链表实现,可以在任意位置高效地插入和删除元素。常用函数有:push_back
:在尾部插入元素。push_front
:在头部插入元素。pop_back
:删除尾部元素。pop_front
:删除头部元素。insert
:在指定位置插入元素。erase
:删除指定位置的元素。size
:返回元素个数。
-
forward_list
:forward_list
通常使用单向链表实现,只支持单向遍历和插入操作。常用函数有:push_front
:在头部插入元素。pop_front
:删除头部元素。insert_after
:在指定位置后面插入元素。erase_after
:删除指定位置后面的元素。size
:返回元素个数。