案例:
#define D_SCL_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
#include "list"
#include "vector"
#include "string"
#include "algorithm"
#include "set"
#include "functional"
#include "iterator"
#include<numeric>
void printV(vector<int> &v)
{
for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
{
cout << *it << " ";
}
cout << endl;
}
void printList(list<int> &v)
{
for (list<int>::iterator it = v.begin(); it != v.end(); it++)
{
cout << *it << " ";
}
cout << endl;
}
//回调函数
void showElem(int &n)
{
cout << n << " ";
}
//函数对象
class MyShow
{
public:
MyShow()
{
num = 0;
}
void operator()(int &v)
{
num++;
cout << v << " ";
}
void printNum()
{
cout << "num: " << num << endl;
}
private:
int num;
};
void main41_foreach()
{
vector<int> v1;
v1.push_back(1);
v1.push_back(3);
v1.push_back(5);
printV(v1);
//第三个参数是回调函数入口地址
for_each(v1.begin(), v1.end(), showElem);
cout << endl;
//第三个参数是函数对象
MyShow My1 = for_each(v1.begin(), v1.end(), MyShow()); //有三个元素所以调用3次 num = 3
cout << endl;
My1.printNum();
/*
template<class _InIt,
class _Fn1> inline
_Fn1 for_each(_InIt _First, _InIt _Last, _Fn1 _Func)
{ // perform function for each element
_DEBUG_RANGE(_First, _Last);
_DEBUG_POINTER(_Func);
return (_For_each(_Unchecked(_First), _Unchecked(_Last), _Func));
}? 注意 for_each 的第三个参数 函数对象做函数参数,函数对象做返回值
*/
MyShow mya;
MyShow My2 = for_each(v1.begin(), v1.end(), mya);//给My2初始化 mya是实参 _Fn1 _Func是形参 会调用_Fn1类的拷贝函数 只是拷贝一份
cout << endl;
mya.printNum(); //mya和My2是两个不同的的对象
My2.printNum();
My2 = for_each(v1.begin(), v1.end(), mya); //给My2赋值 匿名对象的去和留
My2.printNum();
}
int increase(int i)
{
return i + 100;
}
void main42_transform()
{
vector<int> v1;
v1.push_back(1);
v1.push_back(3);
v1.push_back(5);
printV(v1);
/*
template<class _InIt,
class _OutIt,
class _Fn1> inline
_OutIt transform(_InIt _First, _InIt _Last,
_OutIt _Dest, _Fn1 _Func)
{ // transform [_First, _Last) with _Func
_DEBUG_RANGE_PTR(_First, _Last, _Dest);
_DEBUG_POINTER_IF(_First != _Last, _Func);
return (_Transform1(_Unchecked(_First), _Unchecked(_Last),
_Dest, _Func, _Is_checked(_Dest)));
}
*/
//使用回调函数
transform(v1.begin(), v1.end(), v1.begin(), increase);
printV(v1);
//使用预定义函数对象
transform(v1.begin(), v1.end(), v1.begin(), negate<int>()); //转换成负数
printV(v1);
//使用函数适配器
list<int> mylist;
mylist.resize(v1.size()); //分配空间
transform(v1.begin(), v1.end(), mylist.begin(), bind2nd(multiplies<int>(), 10)); //vector中的值乘以10 转换到list里面
printList(mylist);
//transform也可以转化的结果直接输出到屏幕 使用输出迭代器ostream_iterator
transform(v1.begin(), v1.end(), ostream_iterator<int>(cout , " "), negate<int>()); //vector中的值乘以10 转换到list里面
}
/*//回调函数
//一般情况下:for_each 所使用的函数对象,参数是引用,没有返回值
void showElem(int &n)
{
cout << n << " ";
}
*/
//transform回调函数
//transform 所使用的函数对象,参数一般不使用引用,而是还有返回值
int showElem2(int n)
{
cout << n << " ";
return n;
}
void main43_transform_pk_foreach()
{
vector<int> v1;
v1.push_back(1);
v1.push_back(3);
v1.push_back(5);
vector<int> v2 = v1;
printV(v1);
for_each(v1.begin(), v1.end(), showElem);
cout << endl;
//transform对回调函数返回值的要求:1、有返回值 2、参数是值传递
transform(v1.begin(), v1.end(), v2.begin(), showElem2);
}
void main44_adjacent_find()
{
vector<int> v1;
v1.push_back(1);
v1.push_back(2);
v1.push_back(3);
v1.push_back(3);
v1.push_back(5);
vector<int>::iterator it = adjacent_find(v1.begin(), v1.end()); //*it == 3
if (it == v1.end())
cout << "没有找到重复的元素" << endl;
else
cout << "找到重复的元素: " << *it << endl;
int index = distance(v1.begin(), it);
cout << "重复元素的下标是:" << index << endl;
}
void main45_binary_search()
{
vector<int> v1;
v1.push_back(1);
v1.push_back(2);
v1.push_back(3);
v1.push_back(4);
v1.push_back(5);
bool find = binary_search(v1.begin(), v1.end(), 3);
if (find == true)
cout << "找到了" << endl;
else
cout << "没有找到" << endl;
}
void main46_count()
{
vector<int> v1;
v1.push_back(1);
v1.push_back(2);
v1.push_back(3);
v1.push_back(4);
v1.push_back(5);
v1.push_back(4);
v1.push_back(5);
int num = count(v1.begin(), v1.end(), 5);
cout << "5的个数:" << num << endl;
}
//一元谓词 大于3的数
bool GreatThree(int num)
{
if (num > 3)
{
return true;
}
else
{
return false;
}
}
void main47_count_if()
{
vector<int> v1;
v1.push_back(1);
v1.push_back(2);
v1.push_back(3);
v1.push_back(4);
v1.push_back(5);
v1.push_back(4);
v1.push_back(5);
int num = count_if(v1.begin(), v1.end(), GreatThree);
cout << "大于3的个数:" << num << endl;
}
//find返回的是一个迭代器的位置
void main48_find()
{
vector<int> v1;
v1.push_back(1);
v1.push_back(2);
v1.push_back(3);
v1.push_back(4);
v1.push_back(5);
v1.push_back(4);
v1.push_back(5);
//find返回的是一个迭代器的位置
vector<int>::iterator it = find(v1.begin(), v1.end(), 3);
cout << "第一个等于3的*it : " << *it << endl;
vector<int>::iterator it2 = find_if(v1.begin(), v1.end(), GreatThree);
cout << "第一个大于3的*it2 : " << *it2 << endl;
}
void main_merge()
{
vector<int> v1;
v1.push_back(1);
v1.push_back(3);
v1.push_back(5);
vector<int> v2;
v2.push_back(2);
v2.push_back(4);
v2.push_back(6);
vector<int> v3;
v3.resize(v1.size() + v2.size());
merge(v1.begin(), v1.end(), v2.begin(), v2.end(), v3.begin());
printV(v3);
}
class Student
{
public:
Student(string name, int id)
{
m_name = name;
m_id = id;
}
void printT()
{
cout << "name : " << m_name << "id : " << m_id << endl;
}
public:
string m_name;
int m_id;
};
bool Compare(Student &s1, Student &s2)
{
return (s1.m_id < s2.m_id);
}
void main_sort()
{
Student s1("老大", 1);
Student s2("老二", 2);
Student s3("老三", 3);
vector<Student> v1;
v1.push_back(s3);
v1.push_back(s2);
v1.push_back(s1);
for (vector<Student>::iterator it = v1.begin(); it!= v1.end(); it++)
{
it->printT();
}
sort(v1.begin(), v1.end(), Compare);
for (vector<Student>::iterator it = v1.begin(); it != v1.end(); it++)
{
it->printT();
}
}
//对指定范围内的元素随机调整次序。
//srand(time(0)); 设置随机种子
void main_random_shuffle()
{
vector<int> v1;
v1.push_back(1);
v1.push_back(3);
v1.push_back(5);
v1.push_back(7);
v1.push_back(9);
random_shuffle(v1.begin(), v1.end());
printV(v1); //随机
string str = "abcdefg";
random_shuffle(str.begin(), str.end());
cout << str << endl; //随机
}
void main_rverse()
{
vector<int> v1;
v1.push_back(1);
v1.push_back(3);
v1.push_back(5);
v1.push_back(7);
v1.push_back(9);
reverse(v1.begin(), v1.end());
printV(v1);
}
void main_copy()
{
vector<int> v1;
v1.push_back(1);
v1.push_back(3);
v1.push_back(5);
vector<int> v2;
v2.resize(v1.size());
copy(v1.begin(), v1.end(), v2.begin());
printV(v2);
}
void main_replace_and_replace_if()
{
vector<int> v1;
v1.push_back(1);
v1.push_back(3);
v1.push_back(5);
replace(v1.begin(), v1.end(), 3, 8); //3 替换成 8
printV(v1);
replace_if(v1.begin(), v1.end(), GreatThree, 1); //大于等于3 替换成 1
printV(v1);
}
void main_swap()
{
vector<int> v1;
v1.push_back(1);
v1.push_back(3);
v1.push_back(5);
vector<int> v2;
v2.push_back(2);
v2.push_back(4);
v2.push_back(6);
swap(v1, v2);
printV(v1);
printV(v2);
}
void main_accumulate()
{
vector<int> v1;
v1.push_back(1);
v1.push_back(3);
v1.push_back(5);
int tmp = accumulate(v1.begin(), v1.end(), 100); //各个元素之相加再加100 结果: 109
cout << tmp << endl;
}
void main_fill()
{
vector<int> v1;
v1.push_back(1);
v1.push_back(3);
v1.push_back(5);
printV(v1);
fill(v1.begin(), v1.end(), 100); //全部替换成100
printV(v1);
}
void main_union()
{
vector<int> v1;
v1.push_back(1);
v1.push_back(3);
v1.push_back(5);
vector<int> v2;
v2.push_back(2);
v2.push_back(4);
v2.push_back(6);
vector<int> v3;
v3.resize(v1.size()+v2.size());
set_union(v1.begin(), v1.end(), v2.begin(), v2.end(), v3.begin()); //合并不同的元素
printV(v3);
}
void main()
{
//常用的查找算法
//main41_foreach();
//main42_transform();
//main43_transform_pk_foreach();
//main44_adjacent_find();
//main45_binary_search();
//main46_count();
//main47_count_if();
//main48_find();
//常用的排序算法
//main_merge();
//main_sort();
//main_random_shuffle();
//main_rverse();
//常用的拷贝和替换算法
//main_copy();
//main_replace_and_replace_if();
//main_swap();
//常用的算术和生成算法
//main_accumulate();
//main_fill();
//常用的集合算法
main_union();
system("pause");
}