文章目录
STL
Standard Template Library,标准模板库;STL借助模板吧常用的数据结构及其算法都实现了一遍,并且做到了数据结构和算法的分离。
vector 的底层为顺序表(数组),list 的底层为双向链表,deque 的底层为循环队列,set 的底层为红黑树,hash_set 的底层为哈希表。
STL组成结构
STL容器的种类和功能
容器种类 | 功能 |
---|---|
序列容器 | 主要包括 vector 向量容器、list 列表容器以及 deque 双端队列容器。之所以被称为序列容器,是因为元素在容器中的位置同元素的值无关,即容器不是排序的。将元素插入容器时,指定在什么位置,元素就会位于什么位置。 |
排序容器 | 包括 set 集合容器、multiset多重集合容器、map映射容器以及 multimap 多重映射容器。排序容器中的元素默认是由小到大排序好的,即便是插入元素,元素也会插入到适当位置。所以关联容器在查找时具有非常好的性能。 |
哈希容器 | C++ 11 新加入 4 种关联式容器,分别是 unordered_set 哈希集合、unordered_multiset 哈希多重集合、unordered_map 哈希映射以及 unordered_multimap 哈希多重映射。和排序容器不同,哈希容器中的元素是未排序的,元素的位置由哈希函数确定。 |
STL序列式容器
容器用于存放数据的类模板
迭代器(iterator)
- 不同容器的迭代器不同,功能强弱也不同
迭代器的功能是遍历容器,在遍历的同时可以访问(修改)容器中的元素,但是不能初始化空的容器。
空容器的begin(),end()指向同一个位置,无法循环赋值
迭代器 | |
---|---|
输入迭代器 | ~ |
输出迭代器 | ~ |
前向迭代器 | ++p,p++,*p,赋值,复制,==,!=, |
双向迭代器 | ++p,p++,*p,赋值,复制,==,!=,–p,p– |
随机访问迭代器 | ++p,p++,*p,赋值,复制,==,!=,–p,p–,p+=i(向后移动i个元素);p-=i;p+i(返回p后面第i个元素的迭代器);p-i;p[i](返回p后面第i个元素的引用),>,< |
//array<int, 4>::iterator i;
//逐个输出元素
vector<int>::iterator i;//指针
for (i = ar.begin(); i != ar.end(); i++)
{
cout << *i << " ";
}
cout << endl << "第三种" << endl;
for (i = ar.begin(); i < ar.end(); i++)
{
cout << *i << " ";
}
cout << endl << "第四种" << endl;
i = ar.begin();
while (i < ar.end())
{
cout << *i << " ";
i += 2;
}
- 定义
名称 | 功能 |
---|---|
反向迭代器(reverse_iterator) | 又称“逆向迭代器”,其内部重新定义了递增运算符(++)和递减运算符(–),专门用来实现对容器的逆序遍历。 |
安插型迭代器(inserter或者insert_iterator) | 通常用于在容器的任何位置添加新的元素,需要注意的是,此类迭代器不能被运用到元素个数固定的容器(比如 array)上。 |
流迭代器(istream_iterator / ostream_iterator)流缓冲区迭代器(istreambuf_iterator / ostreambuf_iterator) | 输入流迭代器用于从文件或者键盘读取数据;相反,输出流迭代器用于将数据输出到文件或者屏幕上。输入流缓冲区迭代器用于从输入缓冲区中逐个读取数据;输出流缓冲区迭代器用于将数据逐个写入输出流缓冲区。 |
移动迭代器(move_iterator) | 此类型迭代器是 C++ 11 标准中新添加的,可以将某个范围的类对象移动到目标范围,而不需要通过拷贝去移动。 |
迭代器名:表示迭代器指向的元素
反向迭代器和正向迭代器的区别在于:
对正向迭代器进行 ++ 操作时,迭代器会指向容器中的后一个元素;
而对反向迭代器进行 ++ 操作时,迭代器会指向容器中的前一个元素。
int main()
{
list<int> s{
13,24,35,65,98 };
list<int>::reverse_iterator i; //反向迭代器
list<int>::const_iterator m; //返回的是const属性 不能修改
//逆向输出链表中的数据
for (i = s.rbegin(); i != s.rend(); i++)
{
//rbegin() 最后一个元素 rend()第一个元素的前一个位置
//i++ 每次向左移动一个位置
cout << *i << " ";
}
i = s.rbegin();
*i = 11; //可以通过反向迭代器修改数据
cout << endl;
list<int>::iterator p; //正向迭代器
for (p = s.begin(); p != s.end(); p++)
{
cout << *p << " ";
}
cout << endl;
m = s.begin();
//*m = 00; 不能通过迭代器修改链表中的数据
cout << *m << endl;
return 0;
}
顺序容器
不会对存储的元素进行排序,元素排序的顺序取决于存储它们的顺序
函数成员 | 函数功能 | array<T,N> | vector< T> | deque< T> |
---|---|---|---|---|
begin() | 返回指向容器中第一个元素的迭代器。 | 是 | 是 | 是 |
end() | 返回指向容器最后一个元素所在位置后一个位置的迭代器,通常和 begin() 结合使用。 | 是 | 是 | 是 |
rbegin() | 返回指向最后一个元素的迭代器。 | 是 | 是 | 是 |
rend() | 返回指向第一个元素所在位置前一个位置的迭代器。 | 是 | 是 | 是 |
cbegin() | 和 begin() 功能相同,只不过在其基础上,增加了 const 属性,不能用于修改元素。 | 是 | 是 | 是 |
cend() | 和 end() 功能相同,只不过在其基础上,增加了 const 属性,不能用于修改元素。 | 是 | 是 | 是 |
crbegin() | 和 rbegin() 功能相同,只不过在其基础上,增加了 const 属性,不能用于修改元素。 | 是 | 是 | 是 |
crend() | 和 rend() 功能相同,只不过在其基础上,增 |