十九.STL 之 算法
代码片内有详解, 目录:
// 一. 常用遍历算法
// 二. transform
// 三. 常用查找算法
// 四. 常用排序算法
// 五. 常用拷贝和替换算法
// 六. 常用算术生成算法
// 七. 常用集合算法
1.Code
:
#include<iostream>
using namespace std;
#include <algorithm>
#include <vector>
#include<ctime>
#include<numeric>
void Display1(int num)
{
cout << num << " ";
}
class Display2
{
public:
void operator()(int num)
{
cout << num << " ";
}
};
void test()
{
vector<int> v;
for (int i = 0; i < 10; i++)
{
v.push_back(i);
}
for_each(v.begin(),v.end(),Display1);
cout << endl;
for_each(v.begin(), v.end(), Display2());
cout << endl;
}
class Printf
{
public:
void operator()(int num)
{
cout << num << " ";
}
};
class Transform
{
public:
int operator()(int num)
{
cout << num << " ";
return num;
}
};
class gread
{
public:
int operator()(int num,int num1)
{
return num > num1;
}
};
class GreadFive
{
public:
bool operator()(int num)
{
return num > 5;
}
};
class Person
{
public:
Person(string name, int age)
{
this->m_Name = name;
this->m_Age = age;
}
bool operator==(const Person& p)
{
if (this->m_Age == p.m_Age)
{
return true;
}
else
{
return false;
}
}
string m_Name;
int m_Age;
};
class GreatTen
{
public:
bool operator()(int num)
{
return num >= 10;
}
};
class AgeLess35
{
public:
bool operator()(const Person& p)
{
return p.m_Age < 35;
}
};
void test2()
{
int sd;
vector<int> v;
for (int i = 0; i < 10; i++)
{
v.push_back(i*3);
}
for_each(v.begin(),v.end(),Printf());
cout << endl;
vector<int> v1;
v1.resize(v.size());
transform(v.begin(),v.end(),v1.begin(), Transform());
cout << endl;
sort(v1.begin(), v1.end(), gread());
for_each(v1.begin(), v1.end(), Printf());
cout << endl;
vector<int>::iterator it = find(v.begin(),v.end(),9);
if (it == v.end()) { cout << "无" << endl; }
else cout << "有 " << *it << endl;
it = find_if(v.begin(),v.end(),GreadFive());
cout << *it << endl;
v.push_back(2123);
v.push_back(2123);
it = adjacent_find(v.begin(), v.end());
cout << "adjacent_find *it = " << *it << endl;
bool yu = binary_search(v.begin(), v.end(),18);
cout << "binary_search yu = " << yu << endl;
v.push_back(2123);
v.push_back(2123);
sd = count(v.begin(), v.end(), 2123);
cout << "count sd = " << sd << endl;
vector<Person> v6;
Person p1("刘备", 35);
Person p2("关羽", 35);
Person p3("张飞", 35);
Person p4("赵云", 30);
Person p5("曹操", 25);
v6.push_back(p1);
v6.push_back(p2);
v6.push_back(p3);
v6.push_back(p4);
v6.push_back(p5);
Person p("诸葛亮", 35);
int num = count(v6.begin(), v6.end(), p);
cout << "count(v6.begin(), v6.end(), p); num = " << num << endl;
for_each(v.begin(), v.end(), Printf());
num = count_if(v.begin(), v.end(), GreatTen());
cout << "count_if num = " << num << endl;
num = count_if(v6.begin(), v6.end(), AgeLess35());
cout << "小于35岁的个数:" << num << endl;
}
class Grater1
{
public:
bool operator()(int& a, int& b)
{
return a > b;
}
};
void test3()
{
srand((unsigned int)time(NULL));
vector<int> v;
v.push_back(48);
v.push_back(87);
v.push_back(18);
v.push_back(45);
v.push_back(99);
v.push_back(4);
sort(v.begin(),v.end());
for_each(v.begin(),v.end(),Printf());
cout << endl;
sort(v.begin(), v.end(), Grater1());
for_each(v.begin(), v.end(), Printf());
cout << endl;
v.clear();
for (int i = 0; i < 10; i++)
{
v.push_back(i);
}
for_each(v.begin(), v.end(), Printf());
cout << endl;
random_shuffle(v.begin(),v.end());
for_each(v.begin(), v.end(), Printf());
cout << endl;
vector<int> v1;
vector<int> v2;
for (int i = 1; i < 7; i++)
{
v1.push_back(i*34);
}
sort(v.begin(), v.end());
cout << "merge v1:";
for_each(v1.begin(), v1.end(), Printf());
cout << endl;
cout << "merge v:";
for_each(v.begin(), v.end(), Printf());
cout << endl;
v2.resize(v.size() + v1.size());
merge(v.begin(),v.end(),v1.begin(),v1.end(),v2.begin());
cout << "merge (b1,e1,b2,e2,b3):";
for_each(v2.begin(), v2.end(), Printf());
cout << endl;
cout << endl;
random_shuffle(v2.begin(),v2.end());
cout << "reverse(v2.begin(), v2.end());:" << endl;
for_each(v2.begin(), v2.end(), Printf());
cout << endl;
reverse(v2.begin(), v2.end());
for_each(v2.begin(), v2.end(), Printf());
cout << endl;
}
class Re_LessFive
{
public:
bool operator()(int a)
{
return a < 5;
}
};
void test4()
{
vector<int> v;
vector<int> v1;
for (int i = 0; i < 10; i++)
{
v.push_back(i);
}
cout << "v = ";
for_each(v.begin(), v.end(), Printf());
cout << endl;
cout << "copy v -> v1 = ";
v1.resize(v.size());
copy(v.begin(),v.end(),v1.begin());
for_each(v1.begin(), v1.end(), Printf());
cout << endl;
cout << "replace 9 为 1 = ";
replace(v.begin(),v.end(),9,1);
for_each(v.begin(), v.end(), Printf());
cout << endl;
replace_if(v.begin(), v.end(), Re_LessFive(),999);
for_each(v.begin(), v.end(), Printf());
cout << endl;
v.push_back(89);
cout << "v1 = ";
for_each(v1.begin(), v1.end(), Printf());
cout << endl;
cout << "v = ";
for_each(v.begin(), v.end(), Printf());
cout << endl;
swap(v,v1);
cout << "swap(v1,v) v1 = ";
for_each(v1.begin(), v1.end(), Printf());
cout << endl;
cout << "swap(v1,v) v = ";
for_each(v.begin(), v.end(), Printf());
cout << endl;
}
void test5()
{
vector<int> v;
for (int i = 1; i < 10; i++)
{
v.push_back(i);
}
cout << "v 元素数值总和 = " << accumulate(v.begin(), v.end(),10000) << endl;
for_each(v.begin(), v.end(), Printf());
cout << endl;
cout << "fill(v.begin(), v.end(), 8899); v = ";
fill(v.begin(), v.end()-6, 8899);
for_each(v.begin(), v.end(), Printf());
cout << endl;
}
void test6()
{
vector<int> v;
vector<int> v1;
vector<int> v2;
for (int i = 1; i < 10; i++)
{
v.push_back(i);
}
for (int i = 1; i < 10; i++)
{
v1.push_back(i*3);
}
cout << "v = ";
for_each(v.begin(), v.end(), Printf());
cout << endl;
cout << "v1 = ";
for_each(v1.begin(), v1.end(), Printf());
cout << endl;
v2.resize(v.size());
set_intersection(v.begin(), v.end(), v1.begin(), v1.end(), v2.begin());
cout << "set_intersection v2 = ";
for_each(v2.begin(), v2.end(), Printf());
cout << endl;
v2.clear();
v2.resize(v.size());
vector<int>::iterator
it = set_intersection(v.begin(), v.end(), v1.begin(), v1.end(), v2.begin());
cout << "set_intersection v2 = ";
for_each(v2.begin(), it, Printf());
cout << endl;
v2.clear();
v2.resize(v.size() + v1.size());
it = set_union(v.begin(),v.end(),v1.begin(),v1.end(),v2.begin());
cout << "set_union: v2 = ";
for_each(v2.begin(), it, Printf());
cout << endl;
v2.clear();
v2.resize(v.size());
it = set_difference(v.begin(), v.end(), v1.begin(), v1.end(), v2.begin());
cout << "set_difference: v2 = ";
for_each(v2.begin(), it, Printf());
cout << endl;
}
int main()
{
test();
cout <<" --------------------------" << endl;
test2();
cout << " --------------------------" << endl;
test3();
cout << " --------------------------" << endl;
test4();
cout << " --------------------------" << endl;
test5();
cout << " --------------------------" << endl;
test6();
cout << " --------------------------" << endl;
system("pause");
return 0;
}
2.The result of the run
:
