一.容器的介绍
-
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:返回元素个数。