1、变动性算法
#include <vector>
#include <iostream>
#include <list>
#include <algorithm>
using namespace std;
void print_element(int n)
{
cout << n << ' ';
}
void add_3(int& n)
{
n = n + 3;
}
int fun(int n)
{
return 2 * n;
}
bool func(int n)
{
return n < 10;
}
int main() {
int a[] = {1, 2, 3, 4, 5};
vector<int> v(a, a+5);
// 这个for_each会不会改动到原数据取决于你在函数中怎么实现,因为源码中返回的是一个reference引用
for_each(v.begin(), v.end(), print_element);
cout << endl;
for_each(v.begin(), v.end(), add_3);
for_each(v.begin(), v.end(), print_element);
cout << endl;
list<int> l(15);
for_each(l.begin(), l.end(), print_element);
cout << endl;
// copy其实就是for循环从begin到end,然后将里面的值赋值给第三个参数
// 注意:第三个参数的空间必须是已经存在的,copy不会再分配空间
copy(v.begin(), v.end(), l.begin());
for_each(l.begin(), l.end(), print_element);
cout << endl;
// 从末尾开始拷贝
copy_backward(v.begin(), v.end(), l.end());
for_each(l.begin(), l.end(), print_element);
cout << endl;
list<int> l2(5);
transform(v.begin(), v.end(), l2.begin(), fun);
for_each(l2.begin(), l2.end(), print_element);
cout << endl;
// 替换
vector<int> v2(a, a+5);
replace(v2.begin(), v2.end(), 3, 13);
for_each(v2.begin(), v2.end(), print_element);
cout << endl;
// 在拷贝的过程中替换(原数据不变,目标改变)
vector<int> v3(a, a+5);
list<int> l3(5);
replace_copy(v3.begin(), v3.end(), l3.begin(), 13, 3);
for_each(v3.begin(), v3.end(), print_element);
cout << endl;
for_each(l3.begin(), l3.end(), print_element);
cout << endl;
// 在拷贝的过程中执行某个动作
replace_copy_if(v.begin(), v.end(), l3.begin(), func, 0);
for_each(l3.begin(), l3.end(), print_element);
cout << endl;
return 0;
}
// 输出
1 2 3 4 5
4 5 6 7 8
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
4 5 6 7 8 0 0 0 0 0 0 0 0 0 0
4 5 6 7 8 0 0 0 0 0 4 5 6 7 8
8 10 12 14 16
1 2 13 4 5
1 2 3 4 5
1 2 3 4 5
0 0 0 0 0
2、其他算法
#include <iostream>
using namespace std;
#include <algorithm>
#include <vector>
#include <numeric>
void print_element(int n)
{
cout << n << ' ';
}
int mult(int a, int b)
{
return a * b;
}
int main() {
int a[] = {1, 3, 7,2, 3, 4, 5, 6, 7};
vector<int> v(a, a + 9);
for_each(v.begin(), v.end(), print_element);
cout << endl;
// 移除值为3
// 首先查找给定第一个位置,然后遍历后面的元素,如果遇到要删除的元素,删除该元素
// 然后将非删除的元素拷贝到前面,覆盖到前面的元素
remove(v.begin(), v.end(), 3);
for_each(v.begin(), v.end(), print_element);
cout << endl;
//如果要把里面的值删除
int b[] = {1, 3, 7,2, 3, 4, 5, 6, 7};
vector<int> v1(b, b + 9);
v1.erase(remove(v1.begin(), v1.end(), 3), v1.end());
for_each(v1.begin(), v1.end(), print_element);
cout << endl;
int c[] = {1, 2, 3, 4, 5, 6};
vector<int> v2(c, c + 6);
rotate(v2.begin(), v2.begin() + 2, v2.end());
for_each(v2.begin(), v2.end(), print_element);
cout << endl;
// 排序
sort(v2.begin(), v2.end());
for_each(v2.begin(), v2.end(), print_element);
cout << endl;
// 已序区间排序
int d[] = {1, 10, 10, 14, 15, 16};
vector <int> v3(d, d + 6);
vector<int>::iterator it;
it = lower_bound(v3.begin(), v3.end(), 10);
if(it != v3.end())
{
cout << it - v3.begin() << endl;
}
it = upper_bound(v3.begin(), v3.end(), 10);
if(it != v3.end())
{
cout << it - v3.begin() << endl;
}
// 数值算法
int e[] = {1, 2, 3, 4, 5};
vector <int> v4(e, e + 5);
for_each(v4.begin(), v4.end(), print_element);
cout << endl;
// 累加
cout << accumulate(v4.begin(), v4.end(), 1) << endl;
// 累乘
cout << accumulate(v4.begin(), v4.end(), 1, mult) << endl;
return 0;
}
// 输出
1 3 7 2 3 4 5 6 7
1 7 2 4 5 6 7 6 7
1 7 2 4 5 6 7
3 4 5 6 1 2
1 2 3 4 5 6
1
3
1 2 3 4 5
16
120