目录
STL容器简介
什么是容器?
容器用来存储数据的,数据可以是用户自定义类型(对象),也可以是预定义类型。
容器中的迭代器的作用
官方解释
STL中的迭代器是模板类,从某种程度上说,它们是泛型指针。这些模板类让程序员能够对STL容器进行操作。注意,操作也可以是以模板函数的方式提供的STL算法,迭代器是一座桥梁,让这些模板函数能够以一致而无缝的方式处理容器,而容器是模板类。
大白话解释
STL中的迭代器,我们可以把它简单的理解为“万能指针”,这个指针可以指向任何数据类型的地址,实现了不同容器的无缝链接,大家都熟知指针的灵活程度,指针就相当于“大炮”,可以做到“指哪里打哪里”。
“解引用”是什么意思?
"*"的作用是引用指针指向的变量值,引用其实就是引用该变量的地址,“解”就是把该地址对应的东西解开,解出来,就像打开一个包裹一样,那就是该变量的值了,所以称为“解引用”。
这里的“迭代器解引用”与“指针解引用”含义类似。
迭代器在STL中的使用示例
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> Age;
Age.push_back(12);
Age.push_back(20);
Age.push_back(32);
Age.push_back(10);
vector<int>::iterator iter = find(Age.begin(), Age.end(), 10);
if (iter == Age.end() - 1)
{
cout << "容器内有您索引的元素" << endl;
int RelativeAddress = distance(Age.begin(), iter);
cout << "该元素在数组内的索引为" << RelativeAddress << endl;
// 注意元素的索引下标不等同于元素在数组内的相对位置:10 在数组中的位置位列第4,但其索引为3
}
}
容器的分类
容器类型 | 优点 | 缺点 |
std::vector(顺序容器) | 在末尾插入数据时速度快(时间固定)可以像访问数组一样进行访问 | 调整大小时将影响性能搜索时间与容器包含的元素个数成反比只能在末尾插入数据 |
std::deque(顺序容器) | 具备vector的所有优点,还可在容器开头插入数据,插入时间也是固定的 | 有vector的所有缺点与vector不同的是,根据规范,deque不需要支持reserve()函数(该函数让程序员能够给vector预留内存空间,以免频繁地调整大小,从而提高性能) |
std::list(顺序容器) | 在list开头、中间或末尾插入数据,所需时间都是固定的将元素从list中删除所需的时间是固定的,而不管元素的位置如何插入或删除元素后,指向list中其他元素的迭代器仍有效 | 不能像数组那样根据索引随机访问元素搜索速度比vector慢,因为元素没有存储在连续的内存单元中搜索时间与容器中的元素个数成正比 |
std::forward_list(顺序容器) | 单向链表类,只能沿一个方向遍历 | 只能使用push_front()在链表开头插入元素 |
std::set(关联容器) | 搜索时间不与容器中的元素对数成正比,因此搜索速度通常比顺序容器快得多 | 元素的插入速度比顺序容器慢,因为在插入时对元素进行排序 |
std::unordered_set(关联容器) | 搜索、插入和删除的速度几乎不受容器包含的元素个数的影响 | 由于元素未被严格排序,因此不能依赖于元素在容器中的相对位置 |
std::multiset(关联容器) | 需要存储非唯一的值时,应使用这种容器 | 插入速度可能比顺序容器慢,因为在插入时对(键-值对)进行排序 |
std::unordered_multiset(关联容器) | 需要存储非唯一的值时,应使用这种容器,而不是unorder_set,不受容器长度的影响 | 由于元素未被严格排序,因此不能依赖于元素在容器中的相对位置 |
std::map(关联容器) | 用于存储键-值对的容器,搜索时间与元素对数的对数成正比,搜索速度通常比顺序容器快得多 | 插入时进行排序,因此插入速度比顺序容器慢 |
std::unordered_map(关联容器) | 搜索、插入和删除元素的时间是固定的,不受容器长度的影响 | 元素未被严格排序,不适合用于顺序很重要的情形 |
std::multimap(关联容器) | 在需要存储键-值且要求键不唯一时,应选择这种容器,而不是std::map | 插入时进行排序,因此插入速度比顺序容器慢 |
std::unordered_multimap(关联容器) | 在需要存储键-值且要求键不唯一时,应选择这种容器,而不是multimap. 该容器搜索、插入和删除元素的时间是固定的,不受容器长度的影响 | 元素未被严格排序,在需要依赖于元素的相对顺序时,不能使用它 |
为什么要选择容器类型?
显然,可能有多种STL容器能够满足应用程序的需求,这时必须做出选择,这种选择很重要,因为错误的选择将导致性能问题和可扩展性瓶颈。