C++的STL(标准模板库)是一组C++类库,用于支持通用的编程问题,如容器、算法和迭代器等。其中,容器是STL中最常用的组件之一,它们提供了操纵数据的方法和工具。在C++中,容器可以看作是一个盒子,用于存储各种类型的数据对象,并且提供了标准操作,如插入、删除、排序和搜索等。下面是C++ STL库中常见的容器。
vector是STL中最常用的序列式容器之一。它是一个动态数组,可以自动调整大小而不必手动分配或释放内存。vector 提供了许多方法来处理元素,例如向量尾部添加元素(push_back),获取指定位置的元素(at),获取向量中元素的个数(size),以及删除向量中的指定元素(erase)等等。
vector是一个模板类,因此您可以创建任何类型的向量。例如,您可以使用以下行创建一个存储字符串的向量:
std::vector<std::string> str_vector;
deque是另一个序列式容器,名称是 "double-ended queue" 的缩写。它具有与vector相似的接口,但是它允许通过头尾两端添加或删除元素。deque也是一个动态数组,可以自动调整大小,但是与vector不同的是,deque在内部使用多个缓冲区来存储元素,因此它可以更有效地处理插入或删除操作。
以下是创建一个存储int类型数据的deque的示例:
std::deque<int> int_deque;
list是另一个常见的STL容器,它是一个双向链表,允许任意位置的元素插入和删除。由于它实际上是由节点构成的链表,因此对列表进行任何操作都会相对较慢,例如随机访问元素(需要从头循环到目标节点)。
以下是创建一个存储字符串的list的示例:
std::list<std::string> str_list;
set 和 multiset 是两种关联式容器,用于存储唯一的元素,并按照一定的顺序进行排序。set和multiset的区别在于前者只能存储唯一的元素,而后者可以存储重复的元素。
这两种容器提供了快速的查找算法,允许您使用二进制搜索来查找元素。set和multiset有一个非常重要的特性,即在插入新元素时会自动保持容器中的元素排序。
以下是创建一个存储int类型数据的set的示例:
std::set<int> int_set;
map和multimap是C++中的另外两个关联容器,用于存储key-value对。它们具有与set和multiset相同的特征,但是由于它们不仅存储值,还存储关键字(key),因此它们的行为更符合一般的映射表的语义。
map和multimap提供了快速访问元素的方法,并且它们基于红黑树实现,插入和删除操作的开销都是O(log n)级别的。
以下是创建一个存储字符串作为key和int类型数据作为value的map的示例:
std::map<std::string, int> str_int_map;
unordered_set和unordered_map 是C++11中引入的新容器,它们基于哈希表实现,提供了快速的插入、搜索和删除操作。与上面的set、multiset、map和multimap不同的是,这两种容器不会对元素进行排序,而是使用一个哈希函数将元素散列到桶中。
以下是创建一个存储字符串的unordered_set的示例:
std::unordered_set<std::string> str_unordered_set;
以上就是C++的STL库中常用的容器。使用正确的容器可以大大提高代码的可读性和性能,因此在编写代码时需要选择合适的容器。