常用算法
1 常用遍历算法
学习目标:
掌握常用遍历算法
算法简介:
for_each;——遍历容器
transform——搬运容器到另一个容器
3.1 for_each
功能描述:
实现遍历容器,遍历算法,遍历容器元素
函数原型:
for_each(iterator beg,iterator end,_func);
beg开始迭代器
end结束迭代器
_func函数或者函数对象(仿函数)
#include<iostream>
using namespace std;
#include<vector>
//插入算法头文件
#include<algorithm>
//定义普通函数
void print01(int val)
{
cout << val << " ";
}
//定义仿函数
class print02
{
public:
void operator()(int val)
{
cout << val << " ";
}
};
void test01()
{
vector<int> v;
for (int i = 0; i < 10; i++)
{
v.push_back(i);
}
cout << "算法结合普通函数的操作————————————————" << endl;
for_each(v.begin(), v.end(), print01);//遍历算法:操作迭代器、普通函数
cout << endl;
cout << "算法结合仿函数的操作——————————————————" << endl;
for_each(v.begin(), v.end(), print02());//遍历算法:操作迭代器、函数对象(仿函数)
cout << endl;
}
int main()
{
test01();
}
3.2 transform
功能描述:
搬运容器到另一个容器
函数原型:
transform(iterator beg1,iterator end1,iterator beg2,_func);
beg1原容器开始迭代器
end1原容器结束迭代器
beg2目标容器开始迭代器
_func函数或者函数对象(仿函数):在搬运期间,对数据进行一些运算
#include<iostream>
using namespace std;
#include<vector>
//插入算法头文件
#include<algorithm>
//定义普通函数
void print01(int val)
{
cout << val << " ";
}
//定义仿函数
class Transform
{
public:
int operator()(int val)
{
return val;
}
};
void test01()
{
vector<int> v;
for (int i = 0; i < 10; i++)
{
v.push_back(i);
}
vector<int>v2;
v2.resize(v.size());
transform(v.begin(), v.end(), v2.begin(), Transform());//遍历算法参数:一系列迭代器,函数对象(仿函数)
for_each(v2.begin(), v2.end(), print01);
}
int main()
{
test01();
}
2 常用遍历算法
学习目标:
掌握常用查找算法
算法简介:
find;——查找元素
find_if——按条件查找元素
adjacent_find;——查找相邻重复元素
binary_search——二分查找法
count;——统计元素个数
count_if——按条件统计元素个数
2.1 find
功能描述:
按值查找元素,找到返回指定元素的迭代器,找不到返回结束迭代器end().
函数原型:
find(iterator beg ,iterator end ,value);
beg 开始迭代器
end 结束迭代器
value查找的元素
#include<iostream>
using namespace std;
#include<vector>
#include<string>
//插入算法头文件
#include<algorithm>
//(1)查找内置数据类型
void test01()
{
vector<int> v;
for (int i = 0; i < 10; i++)
{
v.push_back(i);
}
//查找容器中是否有5这个元素
vector<int>::iterator it = find(v.begin(), v.end(), 5);
if (it == v.end())
{
cout << "没有找到!" << endl;
}
else
{
cout << "找到:" << *it << endl;
}
}
//(2)查找自定义数据类型:必须在自定义类型内重载==运算符,让find底层知道如何对比自定义数据类型
class Person
{
public:
string m_Name;
int m_Age;
Person(string name, int age)
{
this->m_Name = name;
this->m_Age = age;
}
//重载==运算符,让底层知道如何对比自定义的数据类型
bool operator==(const Person& p)
{
if (this->m_Name == p.m_Name && this->m_Age == p.m_Age)
{
return true;
}
else
{
return false;
}
}
};
void test02()
{
vector<Person> v;
Person p1("张三", 11);
Person p2("李四", 23);
Person p3("王五", 14);
Person p4("赵六", 21);
v.push_back(p1);
v.push_back(p2);
v.push_back(p3);
v.push_back(p4);
//查找容器中是否有p1对象
vector<Person>::iterator it = find(v.begin(), v.end(), p1);
if (it == v.end())
{
cout << "没有找到!" << endl;
}
else
{
cout << "姓名:" << (*it).m_Name <<" 年龄:"<<(*it).m_Age<< endl;
}
}
int main()
{
test01();
test02();
}
总结:
查找自定义类型的数据时,需要在自定义类里面重载==运算符,让底层知道如何对比两个自定义数据类型的数据
2.2 find_if
功能描述:
按条件查找元素,找到返回指定位置的迭代器,找不到返回结束位置的迭代器
函数原型:
find_if(iterator beg ,iterator end ,_Pred);
beg 开始迭代器
end 结束迭代器
_Pred:函数或谓词(返回bool类型的仿函数)
#include<iostream>
using namespace std;
#include<vector>
#include<string>
//插入算法头文件
#include<algorithm>
//(1)查找内置数据类型
class GreaterFive
{
public:
//谓词:重载operator运算符,且返回值为bool类型
bool operator()(int val)
{
return val > 5;
}
};
void test01()
{
vector<int> v;
for (int i = 0; i < 10; i++)
{
v.push_back(i);
}
//查找大于5的数
vector<int>::iterator it = find_if(v.begin(), v.end(), GreaterFive());//参数:函数对象(谓词),也可以是函数
if (it == v.end())
{
cout << "没有找到!" << endl;
}
else
{
cout << "找到:" << *it << endl;
}
}
//(2)查找自定义数据类型:
class Person
{
public:
string m_Name;
int m_Age;
Person(string name, int age)
{
this->m_Name = name;
this->m_Age = age;
}
};
class GreaterFifth
{
public:
//谓词:重载operator运算符,且返回值为bool类型
bool operator()(const Person &p)
{
if (p.m_Age > 15)
{
return true;
}
else
{
return false;
}
}
};
void test02()
{
vector<Person> v;
Person p1("张三", 11);
Person p2("李四", 23);
Person p3("王五", 14);
Person p4("赵六", 21);
v.push_back(p1);
v.push_back(p2);
v.push_back(p3);
v.push_back(p4);
//查找容器中年龄大于15的自定义对象
vector<Person>::iterator it = find_if(v.begin(), v.end(), GreaterFifth());//参数谓词
if (it == v.end())
{
cout << "没有找到!" << endl;
}
else
{
cout << "姓名:" << (*it).m_Name << " 年龄:" << (*it).m_Age << endl;
}
}
int main()
{
test01();
test02();
}
总结:
按条件查找自定义类型的数据时,需要算法的参数为自定义的谓词或函数,里面定义了查找的方法
2.3 adjacent_find
功能描述:
查找相邻重复元素
函数原型:
adjacent_find(iterator beg ,iterator end );
beg 开始迭代器
end 结束迭代器
#include<iostream>
using namespace std;
#include<vector>
#include<string>
//插入算法头文件
#include<algorithm>
void test01()
{
vector<int> v;
v.push_back(1);
v.push_back(2);
v.push_back(2);
v.push_back(5);
v.push_back(3);
v.push_back(2);
v.push_back(1);
//查找相邻元素
vector<int>::iterator it=adjacent_find(v.begin(), v.end());
if (it == v.end())
{
cout << "未找到相邻重复元素" << endl;
}
else
{
cout << "相邻重复元素为:" << *it << endl;
}
}
int main()
{
test01();
}
2.4 binary_search
功能描述:
查找指定元素是否存在,查到返回true否者返回false(注意在无需序列中不可用,既se等t中不可用)
函数原型:
binary_search(iterator beg ,iterator end,value );
beg 开始迭代器
end 结束迭代器
value 查找的值
#include<iostream>
using namespace std;
#include<vector>
#include<string>
//插入算法头文件
#include<algorithm>
void test01()
{
vector<int> v;
v.push_back(1);
v.push_back(2);
v.push_back(2);
v.push_back(5);
v.push_back(3);
v.push_back(2);
v.push_back(1);
//查找是否含有某元素
if (binary_search(v.begin(), v.end(), 5))
{
cout << "找到元素" << endl;
}
else
{
cout << "未找到元素" << endl;
}
}
int main()
{
test01();
}
总结:二分查找法查找效率很高,值得注意的是查找的容器中元素必须为有序序列
2.5 count
功能描述:
统计元素出现的次数
函数原型:
count(iterator beg ,iterator end,value );
beg 开始迭代器
end 结束迭代器
value 查找的值
#include<iostream>
using namespace std;
#include<vector>
#include<string>
//插入算法头文件
#include<algorithm>
//(1)内置数据类型
void test01()
{
vector<int> v;
v.push_back(1);
v.push_back(2);
v.push_back(2);
v.push_back(5);
v.push_back(3);
v.push_back(2);
v.push_back(1);
//查找某元素出现次数
int num=count(v.begin(), v.end(), 2);
cout << "元素出现的个数为:" << num << endl;
}
//(2)自定义数据类型:在定义自己的数据类型的时候,重载==运算符,让count算法底层知道如何对比,进而统计个数
class Person
{
public:
string m_Name;
int m_Age;
Person(string name,int age)
{
this->m_Age = age;
this->m_Name = name;
}
//重载==运算符,让算法底层知道如何判断相等
bool operator==(const Person &p)
{
if (this->m_Age == p.m_Age)
{
return true;
}
else
{
return false;
}
}
};
void test02()
{
vector<Person>v;
Person p1("刘备", 28);
Person p2("关于", 29);
Person p3("张飞", 31);
Person p4("赵云",29);
Person p5("曹操", 38);
v.push_back(p1);
v.push_back(p2);
v.push_back(p3);
v.push_back(p4);
v.push_back(p5);
Person p("诸葛亮", 29);
int num = count(v.begin(), v.end(), p);
cout << "和诸葛亮同年龄的人数为:" << num << endl;
}
int main()
{
test01();
test02();
}
2.6 count_if
功能描述:
按条件统计元素出现的次数
函数原型:
count(iterator beg ,iterator end,_pred);
beg 开始迭代器
end 结束迭代器
_pred 谓词(仿函数,既 重载()运算符,并且返回值为bool类型)
#include<iostream>
using namespace std;
#include<vector>
#include<string>
//插入算法头文件
#include<algorithm>
class MyCompare
{
public:
};
//(1)统计内置数据类型
class GreaterTwo
{
public:
bool operator()(int v)
{
return v > 2;
}
};
void test01()
{
vector<int> v;
v.push_back(1);
v.push_back(2);
v.push_back(2);
v.push_back(5);
v.push_back(3);
v.push_back(2);
v.push_back(1);
//按条件查找某元素出现次数
int num = count_if(v.begin(), v.end(),GreaterTwo());//参数为函数对象(谓词——重载()运算符且返回值为bool类型)
cout << "元素出现的个数为:" << num << endl;
}
//(2)统计自定义数据类型:
class Person
{
public:
string m_Name;
int m_Age;
Person(string name, int age)
{
this->m_Age = age;
this->m_Name = name;
}
};
class Compare
{
public:
//重载()运算符
bool operator()(const Person& p)
{
if ( p.m_Age>30)
{
return true;
}
else
{
return false;
}
}
};
void test02()
{
vector<Person>v;
Person p1("刘备", 28);
Person p2("关于", 29);
Person p3("张飞", 31);
Person p4("赵云", 29);
Person p5("曹操", 38);
v.push_back(p1);
v.push_back(p2);
v.push_back(p3);
v.push_back(p4);
v.push_back(p5);
int num = count_if(v.begin(), v.end(), Compare());//参数:谓词
cout << "年龄大于30的人数为:" << num << endl;
}
int main()
{
test01();
test02();
}