1 算法就是一个个函数模板,大多数在中定义
2 STL中提供能在各种容器中通用的算法,比如查找,排序等
3 算法通过迭代器来操纵容器中的元素。许多算法可以对容器中的一个局部区间进行操作,因此需要两个参数,一个是起始元素的迭代器, 一个时终止元素的后面一个元素的迭代器。比如查找和排序
4 有的算法返回一个迭代器。比如find()算法,在容器中找一个元素,并返回一个指向该元素的迭代器
5 算法可以处理容器,也可以处理普通数组
6 算法示例:find()
template <class InIt, class T>
InIt find(InIt first, InIt last, const T& val);
-- first 和last这两个参数都是容器的迭代器,它们给出了容器中的查找区间起点和终点[first, last)查找等于val的元素
-- 用 == 运算符判断相等
-- 函数返回值是一个迭代器。如果找到,则该迭代器指向被找到的元素。如果找不到,则该迭代器等于last。
例子(见本工程iterator3.cpp)
/**
* find()算法例子
*/
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int main()
{
int array[10] = {10, 20, 30, 40};
// 声明vector容器,并赋值
vector<int> v;
v.push_back(1); v.push_back(2); v.push_back(3); v.push_back(4);
// 声明迭代器
vector<int>::iterator p;
// 查找容器v中元素3的迭代器指向的位置,并返回该迭代器
p = find(v.begin(), v.end(), 3);
if(p != v.end())
cout << *p << endl; // 输出3
p = find(v.begin(), v.end(), 9);
if(p == v.end())
cout << "not found" << endl;
p = find(v.begin() + 1, v.end() - 2, 1); // 整个容器:[1, 2, 3, 4],查找区间:[2, 3) 如果查不到 p的值是查找区间的终点
if(p != v.end())
cout << *p << endl;
int* pp = find(array, array + 4, 20); //数组名是迭代器
cout << *pp << endl;
}
7 STL中 “大” “小” 的概念
-- 关联容器内部的元素是从小到大排序的
-- 有些算法要求其操作的区间是从小到大排序的,称为“有序区间算法”
例如: binary_search
-- 有些算法会对区间进行从小到大排序,称为“排序算法”
例如:sort
-- 还有一些其他算法会用到 “大”, “小” 的概念
使用STL时,在缺省的情况下,以下三个说法等价:
1)x比y小
2)表达式“x < y”为真
3)y 比 x大
8 STL中“相等”概念
-- 有时, “x和y相等”等价于“x==y为真”
例如:在未排序的区间上进行的算法,如顺序查找find
-- 有时, “x和y相等”等价于“x小于y和y小于x同时为假”
例如:
有序区间算法,如binary_search
关联容器自身的成员函数find
......
例子(此工程iterator4.cpp)
/**
* STL中 “相等” 概念演示
*
*/
#include <iostream>
#include <algorithm>
using namespace std;
class A
{
int v;
public:
A(int n):v(n){}
bool operator< (const A& a2) const
{
cout << v << "<" << a2.v << "?" << endl;
return false; // 意味着任何两个class A的对象一个都不会小于另外一个
}
bool operator== (const A& a2) const
{
cout << v << "==" << a2.v << "?" << endl;
return v == a2.v;
}
};
int main()
{
A a[] = {A(1), A(2), A(3), A(4), A(5)};
/**
* 问题:a[]中没有跟A(9)相同的元素,返回值应该是0 但实际输出结果是
* 3 < 9?
* 2 < 9?
* 1 < 9?
* 9 < 1?
* 1
* 原因:根据输出说明binary_search在执行的过程中,判断有没有哪个数组元素与A(9)相等,用的不是== 而是<
* 由于查找过程中 1<9?不成立 9<1?不成立 因此认为1和9相等,返回1
*/
cout << binary_search(a, a+4, A(9)); //折半查找
return 0;
}