一、概述
STL提供了大约100个实现算法的模版函数,比如算法for_each将为指定序列中的每一个元素调用指定的函数,stable_sort以你所指定的规则对序列进行稳定性排序等等。这样一来,只要我们熟悉了STL之后,许多代码可以被大大的化简,只需要通过调用一两个算法模板,就可以完成所需要的功能并大大地提升效率。
“algorithm” 是所有STL头文件中最大的一个(尽管它很好理解),使用STL算法必须包含该头文件,它是由一大堆模版函数组成的,可以认为每个函数在很大程度上都是独立的,其中常用到的功能范围涉及到比较、交换、查找、遍历操作、复制、修改、移除、反转、排序、合并等等。
“numeric” 体积很小,只包括几个在序列上面进行简单数学运算的模板函数,包括加法和乘法在序列上的一些操作。
“functional” 中则定义了一些模板类,用以声明函数对象。
二、函数功能认识
1、查找 find
#include<iostream>
#include<string.h>
#include<vector>
#include<algorithm>
using namespace std;
int main()
{
int num = 12;
vector<int> v;
for (int i = 0; i < 10; i++)
v.push_back(3 * i);
cout << "Vector<int> v : ";
for (vector<int>::size_type index = 0; index != v.size(); ++index)
cout << v[index] << " ";
cout << endl;
vector<int>::iterator result;
result = find(v.begin(), v.end(), num);
if (result != v.end())
cout << "匹配元素的索引:" << result - v.begin() << endl;
else
cout << "没有匹配元素的索引:" << endl;
return 0;
}
- 输出:
Vector v : 0 3 6 9 12 15 18 21 24 27
匹配元素的索引:4
请按任意键继续…
2、条件查找 find_if
利用返回布尔值的谓词判断pred,检查迭代器区间 [first,last) 上的每一个元素,如果迭代器i满足pred(*i)=true,表示找到元素并返回迭代值i(找到的第一个符合条件的元素),未找到元素,返回末位置last。
函数原型:find_if(v.begin(), v.end(), finda)。
bool finda(int x)
{
return (x) % 10 ? 0 : 1;
}
int main()
{
vector<int> V;
for (int i = 0; i < 15; ++i)
V.push_back((i + 1)*(i + 2));
cout << "vector<int> v is: ";
for (vector<int>::size_type index = 0; index != V.size(); ++index)
cout << V[index] << " ";
cout << endl;
vector < int >::iterator result;
result = find_if(V.begin(), V.end(), finda);
if (result != V.end())
cout << "第一个能整除10的元素" << *result << endl;
cout<< "索引" << result - V.begin() << endl;
return 0;
}
- 输出
vector v is: 2 6 12 20 30 42 56 72 90 110 132 156 182 210 240
第一个能整除10的元素20
索引3
请按任意键继续…
3、最后一个子序列查询 find_end
查找子序列v2在v1中最后出现的位置。
函数原型:find_end(v1.begin(), v1.end(), v2.begin(), v2.end())
int main(void)
{
vector<int> v1;
vector<int> v2;
for (int i = 0; i<10; ++i)
v1.push_back(i);
v1.push_back(1);
v1.push_back(2);
v1.push_back(3);
v1.push_back(2);
v1.push_back(3);
v1.push_back(4);
for (int i = 1; i<4; ++i)
v2.push_back(i);
cout << "vector<int> v1: ";
for (vector<int>::size_type index = 0; index != v1.size(); ++index)
cout << v1[index] << " ";
cout << endl;
cout << "vector<int> v2: ";
for (vector<int>::size_type index = 0; index != v2.size(); ++index)
cout << v2[index] << " ";
cout << endl;
vector<int>::iterator result = find_end(v1.begin(), v1.end(), v2.begin(), v2.end());
if (result != v1.end())
cout << "v2在v1的最后位置:v[" << result - v1.begin() << "]" << endl;
else
cout << "v2不在v1中" << endl;
return 0;
}
- 输出:
vector v1: 0 1 2 3 4 5 6 7 8 9 1 2 3 2 3 4
vector v2: 1 2 3
v2在v1的最后位置:v[10]
请按任意键继续…
4、统计 count
元素统计count:统计某个指定的值出现了多少次。
函数原型:count(v.begin(), v.end(), value)
int main()
{
vector<int> v;
for (int i = 0; i < 10; i++)
v.push_back(i);
v.push_back(5);
cout << "vector<int> v is:";
for (vector<int>::size_type index = 0; index != v.size(); ++index)
cout << v[index] << " ";
cout << endl;
int Count = count(v.begin(), v.end(), 5); //统计5出现的次数
cout << "次数:" << Count << endl;
return 0;
}
- 输出:
vector v is:0 1 2 3 4 5 6 7 8 9 5
次数:2
请按任意键继续…
5、条件统计 count_if
条件统计count_if:统计符合某个指定条件的值出现了多少次。
函数原型:count_if(v.begin(), v.end(), greater6)
bool greater6(int x)
{
return x % 3 == 0;
}
int main()
{
vector<int> v;
for (int i = 0; i < 10; i++)
v.push_back(i);
cout << "vector<int> v is : ";
for (vector<int>::size_type index = 0; index != v.size(); ++index)
cout << v[index] << " ";
cout << endl;
int Ret = count_if(v.begin(), v.end(), greater6);
cout << Ret << endl;
}
- 输出:
vector v is : 0 1 2 3 4 5 6 7 8 9
4
请按任意键继续…
6、子序列搜索search
在一个序列中搜索与另一序列匹配的子序列。参数分别为一个序列的开始位置,结束位置和另一个序列的开始,结束位置。
函数原型:search(v1.begin(), v1.end(), v2.begin(), v2.end())
int test()
{
vector<int> v1;
vector<int> v2;
for (int i = 0; i < 10; i++)
v1.push_back(i);
for (int i = 4; i < 6; i++)
v2.push_back(i);
cout << "vector<int> v1 :";
for (vector<int>::size_type index = 0; index < v1.size(); index++)
cout << v1[index] << " ";
cout << endl;
cout << "vector<int> v2 :";
for (vector<int>::size_type index = 0; index < v2.size(); index++)
cout << v2[index] << " ";
cout << endl;
vector<int>::iterator result = search(v1.begin(), v1.end(), v2.begin(), v2.end());
if (result != v1.end())
cout << "V2的元素包含在v1中,范围:v1[" << result - v1.begin() << "]~v1[" << result + v2.size() - v1.begin() - 1 << "]" << endl;
else
cout << "v2的元素不包含在v1中" << endl;
return 0;
}
int main()
{
test();
return 0;
}
- 输出:
vector v1 :0 1 2 3 4 5 6 7 8 9
vector v2 :4 5
V2的元素包含在v1中,范围:v1[4]~v1[5]
请按任意键继续…
7、复制copy
将一个容器的元素复制到另一个元素中。
函数原型:copy(v1.begin(), v1.end(), v2.begin())
void test()
{
vector<int> v1;
vector<int> v2;
for (int i = 11; i<15; ++i)
v1.push_back(i);
for (int i = 0; i<10; ++i)
v2.push_back(i);
cout << "vector<int> v1: ";
for (vector<int>::size_type index = 0; index != v1.size(); ++index)
cout << v1[index] << " ";
cout << endl;
cout << "vector<int> v2: ";
for (vector<int>::size_type index = 0; index != v2.size(); ++index)
cout << v2[index] << " ";
cout << endl<<endl;
copy(v1.begin(), v1.end(), v2.begin());
cout << "vector<int> v2: ";
for (vector<int>::size_type index = 0; index != v2.size(); ++index)
cout << v2[index] << " ";
cout << endl;
cout << "vector<int> v1: ";
for (vector<int>::size_type index = 0; index != v1.size(); ++index)
cout << v1[index] << " ";
cout << endl;
}
- 输出:
vector v1: 11 12 13 14
vector v2: 0 1 2 3 4 5 6 7 8 9
vector v2: 11 12 13 14 4 5 6 7 8 9
vector v1: 11 12 13 14
请按任意键继续…
8、元素改变transform
将一个容器的元素改变之后放到另一个容器中。
函数原型:transform(v1.begin(), v1.end(), v2.begin(), op_increase)
int op_increase(int x)
{
return x*x;
}
void test()
{
vector<int> v1;
vector<int> v2;
for (int i = 11; i<15; ++i)
v1.push_back(i);
for (int i = 0; i<10; ++i)
v2.push_back(i);
cout << "vector<int> v1: ";
for (vector<int>::size_type index = 0; index != v1.size(); ++index)
cout << v1[index] << " ";
cout << endl;
cout << "vector<int> v2: ";
for (vector<int>::size_type index = 0; index != v2.size(); ++index)
cout << v2[index] << " ";
cout << endl<<endl;
transform(v1.begin(), v1.end(), v2.begin(), op_increase);
cout << "vector<int> v2: ";
for (vector<int>::size_type index = 0; index != v2.size(); ++index)
cout << v2[index] << " ";
cout << endl;
cout << "vector<int> v1: ";
for (vector<int>::size_type index = 0; index != v1.size(); ++index)
cout << v1[index] << " ";
cout << endl;
}
- 输出:
vector v1: 11 12 13 14
vector v2: 0 1 2 3 4 5 6 7 8 9
vector v2: 121 144 169 196 4 5 6 7 8 9
vector v1: 11 12 13 14
请按任意键继续…
9、替换replace
将指定元素值替换为新值。
函数原型:replace(v.begin(), v.end(), n, m)
int main()
{
vector<int> v;
for (int i = 0; i < 10; i++)
v.push_back(i);
v.push_back(5);
cout << "vector<int> v is:";
for (vector<int>::size_type index = 0; index != v.size(); ++index)
cout << v[index] << " ";
cout << endl<<endl;
replace(v.begin(), v.end(), 5, 100); //将5替换成100
cout << "vector<int> v is:";
for (vector<int>::size_type index = 0; index != v.size(); ++index)
cout << v[index] << " ";
cout << endl;
return 0;
}
- 输出:
vector v is:0 1 2 3 4 5 6 7 8 9 5
vector v is:0 1 2 3 4 100 6 7 8 9 100
请按任意键继续…
10、fill_n(b,n,v)
填充[b, b+n)范围。
函数原型:fill(b, n, m)
int main()
{
vector<int> v;
for (int i = 0; i < 10; i++)
v.push_back(i);
v.push_back(5);
cout << "vector<int> v is:";
for (vector<int>::size_type index = 0; index != v.size(); ++index)
cout << v[index] << " ";
cout << endl<<endl;
fill_n(v.begin(), 3, 100); //
cout << "vector<int> v is:";
for (vector<int>::size_type index = 0; index != v.size(); ++index)
cout << v[index] << " ";
cout << endl;
return 0;
}
- 输出:
vector v is:0 1 2 3 4 5 6 7 8 9 5
vector v is:100 100 100 3 4 5 6 7 8 9 5
请按任意键继续…
11、容器填充 generate
按一定方法填充容器。
函数原型:generate(v.begin(), v.end(), increase)
int increase(void)
{
static int x = 1;
return (x++) + (x+2);
}
int main(void)
{
vector<int> v(10);
generate(v.begin(), v.end(), increase);
cout << "vector<int> v: ";
for (vector<int>::size_type i = 0; i<v.size(); ++i)
cout << v[i] << " ";
cout << endl;
return 0;
}
- 输出:
vector v: 4 6 8 10 12 14 16 18 20 22
请按任意键继续…
12、移除 remove
remove并不会真正删除容器中的元素。是把区间内的元素值为指定值的元素的位置腾出,然后后面的元素就会往前移动,但是原来容器的end()并不会改变。
函数原型:remove(v.begin(), v.end(), n)
int main()
{
vector<int> v;
for (int i = 1; i<=10; i++)
v.push_back(i);
cout << "vector<int> v: ";
for (vector<int>::size_type i = 0; i<v.size(); ++i)
cout << v[i] << " ";
cout << endl;
remove(v.begin(), v.end(), 5); //
cout << "Remove vector<int> v: ";
for (vector<int>::iterator it = v.begin(); it != v.end(); ++it)
cout << *it << " ";
cout << endl;
return 0;
}
- 输出:
vector v: 1 2 3 4 5 6 7 8 9 10
Remove vector v: 1 2 3 4 6 7 8 9 10 10
请按任意键继续…
13、unique
删除相邻的重复元素,然后重新排列输入范围内的元素。
函数原型:unique(v.begin(), v.end())
int main(void)
{
vector<int> v;
v.push_back(1);
v.push_back(1);
v.push_back(2);
v.push_back(2);
v.push_back(3);
v.push_back(3);
v.push_back(4);
v.push_back(4);
cout << "vector<int> v: ";
for(vector<int>::size_type i=0; i<v.size(); ++i)
cout << v[i] << " ";
cout << endl;
unique(v.begin(), v.end());
cout << "Unique vector<int> v: ";
for(vector<int>::iterator it=v.begin(); it!=v.end(); ++it)
cout << *it << " ";
cout << endl;
return 0;
}
- 输出:
vector v: 1 1 2 2 3 3 4 4
Unique vector v: 1 2 3 4 3 3 4 4
请按任意键继续…
14、排序 Sort
- 函数原型:sort (v.begin(), v.end())
int main(void)
{
vector<int> v;
v.push_back(1);
v.push_back(7);
v.push_back(8);
v.push_back(4);
v.push_back(9);
v.push_back(3);
v.push_back(10);
v.push_back(15);
cout << "vector<int> v: ";
for(vector<int>::size_type i=0; i<v.size(); ++i)
cout << v[i] << " ";
cout << endl;
sort(v.begin(), v.end());
cout << "Sort vector<int> v: ";
for(vector<int>::iterator it=v.begin(); it!=v.end(); ++it)
cout << *it << " ";
cout << endl;
return 0;
}
- 输出:
vector v: 1 1 2 2 3 3 4 4
Unique vector v: 1 2 3 4 3 3 4 4
请按任意键继续…
也可以自己编写排序函数:
bool function(int x, int y)
{
return (x > y);
}
int main(void)
{
vector<int> v;
v.push_back(1);
v.push_back(7);
v.push_back(8);
v.push_back(4);
v.push_back(9);
v.push_back(3);
v.push_back(10);
v.push_back(15);
cout << "vector<int> v: ";
for (vector<int>::size_type i = 0; i<v.size(); ++i)
cout << v[i] << " ";
cout << endl;
sort(v.begin(), v.end(), function);
cout << "Sort vector<int> v: ";
for (vector<int>::iterator it = v.begin(); it != v.end(); ++it)
cout << *it << " ";
cout << endl;
return 0;
}