一、常用的遍历算法
1.for_each:遍历容器元素
2. transform算法 将指定容器区间元素搬运到另一容器中
int myTransway(int val)
{
return val;
}
class MyTransInt
{
public:
int operator()(int val)
{
return val;
}
};
void test()
{
vector v1;
v1.push_back(10);
v1.push_back(20);
v1.push_back(30);
v1.push_back(40);
//将v1容器的元素 帮运到 v2中
vector v2;
//预先:设置v2的大小(注意!!!)
v2.resize(v1.size());
//transform(v1.begin(), v1.end(), v2.begin(),myTransway );
transform(v1.begin(), v1.end(), v2.begin(), MyTransInt());
for_each(v2.begin(), v2.end(), [](int val) {cout << val << " "; });
}
二、常用的查找算法 1. find算法 查找元素
失败返回v.end(),注意v.end()并不是最后一个元素,而是最后一个元素之后的节点。
class Person
{
public:
string name;
int age;
public:
Person(string name, int age)
{
this-> name = name;
this-> age = age;
}
bool operator==(const Person &ob)
{
if (this-> name == ob.name && this-> age == ob.age)
return true;
return false;
}
};
void test01()
{
vector v1;
v1.push_back(10);
v1.push_back(20);
v1.push_back(30);
v1.push_back(40);
vector::iterator ret;
ret = find(v1.begin(), v1.end(), 20);
if (ret != v1.end())
{
cout << "找到的数据为:" << *ret << endl;
}
vector v2;
v2.push_back(Person("德玛西亚", 18));
v2.push_back(Person("小法", 19));
v2.push_back(Person("小炮", 20));
v2.push_back(Person("牛头", 21));
Person tmp("小炮", 20);
vector::iterator ret2;
//对于find寻找自定义数据 需要重载==
ret2 = find(v2.begin(), v2.end(), tmp);
if (ret2 != v2.end())
{
cout << "找到的数据name=" << (*ret2).name << ",age=" << (*ret2).age << endl;
}
}
2、find_if条件查找
bool myGreaterThan20(int val)
{
return val > 20;
}
class MyGreaterThan20 {
public:
bool operator()(int val)
{
return val > 20;
}
};
void test02()
{
vector v1;
v1.push_back(10);
v1.push_back(20);
v1.push_back(30);
v1.push_back(40);
//寻找第一个大于20的数
vector::iterator ret;
//ret = find_if(v1.begin(),v1.end(), myGreaterThan20 );
ret = find_if(v1.begin(), v1.end(), MyGreaterThan20());
if (ret != v1.end())
{
cout << "寻找到的数据为:" << *ret << endl;
}
}
3.binary_search算法 二分查找法(容器必须有序)
void test03()
{
vector v1;
v1.push_back(10);
v1.push_back(20);
v1.push_back(30);
v1.push_back(40);
v1.push_back(50);
bool ret = binary_search(v1.begin(), v1.end(), 30);
if (ret == true)
{
cout << "找到" << endl;
}
else
{
cout << "未找到" << endl;
}
}
4.count算法 统计元素出现次数
void test04()
{
vector v1;
v1.push_back(10);
v1.push_back(20);
v1.push_back(10);
v1.push_back(40);
v1.push_back(10);
cout << count(v1.begin(), v1.end(), 10) << endl;//3
}
5、count_if算法 统计元素出现次数
void test05()
{
vector v1;
v1.push_back(10);
v1.push_back(20);
v1.push_back(10);
v1.push_back(40);
v1.push_back(10);
cout << count(v1.begin(), v1.end(), 10) << endl;//3
//普通函数
cout << count_if(v1.begin(), v1.end(), myGreaterThan10) << endl;//2
//函数对象
cout << count_if(v1.begin(), v1.end(), MyGreaterThan10()) << endl;//2
//内建函数对象
cout << count_if(v1.begin(), v1.end(), bind2nd(greater(), 10))
<< endl;//2
}
三、常用排序算法 1、merge算法 容器元素合并,并存储到另一容器中(每个容器必须有序)
2、sort算法 容器元素排序 3.random_shuffle算法 对指定范围内的元素随机调整次序
#include
void test07()
{
vector v1;
v1.push_back(1);
v1.push_back(3);
v1.push_back(5);
v1.push_back(7);
//srand设置种子
srand(time(NULL));
for_each(v1.begin(), v1.end(), [](int val) {cout << val << " "; });
cout << endl;
//需要配置 srand
random_shuffle(v1.begin(), v1.end());
for_each(v1.begin(), v1.end(), [](int val) {cout << val << " "; });
cout << endl;
}
4、reverse算法 反转指定范围的元素
四、常用拷贝和替换算法 1、copy算法 将容器内指定范围的元素拷贝到另一容器中
2、replace算法 将容器内指定范围的旧元素修改为新元素 3、replace_if算法 将容器内指定范围满足条件的元素替换为新元素
void test09()
{
vector v1;
v1.push_back(1);
v1.push_back(3);
v1.push_back(5);
v1.push_back(7);
//将容器中的3替换成3000
replace(v1.begin(), v1.end(), 3, 3000);
copy(v1.begin(), v1.end(), ostream_iterator(cout, " "));
cout << endl;
vector v2;
v2.push_back(1);
v2.push_back(3);
v2.push_back(5);
v2.push_back(7);
//将容器的大于3替换成3000
replace_if(v2.begin(), v2.end(), bind2nd(greater(), 3), 1000);
copy(v2.begin(), v2.end(), ostream_iterator(cout, " "));
cout << endl;
}
replace_if(v2.begin(),v2.end(), bind2nd(greater(),3) , 1000 );
将大于3的数字替换为1000
4.swap算法 互换两个容器的元素
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)