算法
如何衡量一个算法的好坏:时间复杂度+空间复杂度。
算法:问题的求解步骤,以有限的步骤,解决数学或逻辑中的问题。STL中的算法主要分为两大类:与数据结构相关算法(容器中的成员函数)和通用算法(与数据结构不相干)。
STL中通用算法总共有70多个,主要包含:
排序,查找,排列组合,数据移动,拷贝,删除,比较组合,运算等。
什么是通用类型算法:
通用算法本身不会执行容器的操作,它们只会运行于迭代器之上,执行迭代器的操作。
- 算法永远不会改变底层容器的大小。
- 算法可能改变容器中保存的元素的值,也可能在容器内移动元素,但永远不会直接添加或删除元素。
以find算法(找元素在区间中第一次出现的位置)为例:
// 在[first, last)中查找value第一次出现的位置,找到返回该元素的位置,否则返回last
// 时间复杂度O(N)
template<class InputIterator, class T>
InputIterator find ( InputIterator first, InputIterator last, const T& value )
{
for ( ;first!=last; first++) if ( *first==value ) break;
return first;
}
// 在[first, last)中查找满足pred条件的元素第一次出现的位置,找到返回该位置,否则返回last
// 时间复杂度O(N)
template<class InputIterator, class Predicate>
InputIterator find_if ( InputIterator first, InputIterator last, Predicate pred )
{
for ( ; first!=last ; first++ ) if ( pred(*first) ) break;
return first;
}
find通用算法:vector、list、deque。
map、unordered_map不会使用find算法进行查找,自己包含有自己的find算法。map使用二叉树算法、unordered_map使用哈希算法。
迭代器
1.迭代器是一种设计模式。
2.作用:
让用户通过特定的接口访问容器的数据,不需要了解容器内部的底层数据结构。
3.分类:
- 正向迭代器:普通迭代器 const类型迭代器
- 反向迭代器(对正向迭代器的适配):普通迭代器 const类型迭代器
4.迭代器本质:
实际上是对指针进行的封装。除vector外,vector的迭代器实际就是原生态指针的别名。
5.迭代器由谁