常用算法(下)
一、常用拷贝和替换算法
1.copy
容器内指定范围内的元素拷贝到另一容器中。函数原型:
c++
copy(iterator beg,iterator end,iterator dest);
使用示例:
c++
void print01(int val)
{
cout << val << " ";
}
//copy
void test01()
{
vector<int>v;
for (int i = 0; i < 10; i++)
{
v.push_back(i);
}
for_each(v.begin(), v.end(), print01);
cout << endl;
//copy复制
vector<int>v2;
v2.resize(v.size());//复制时,空容器一定要预先指定大小
copy(v.begin(), v.end(), v2.begin());
for_each(v2.begin(), v2.end(), print01);
cout << endl;
}
空容器一定要提前开辟空间
2.replace
将指定范围内的旧元素修改为新元素 。函数原型:replace(iterator beg,iterator end,old value,newvalue);
c++
void test02()
{
vector<int>v;
for (int i = 0; i < 10; i++)
{
v.push_back(i);
}
cout << "befor replace:" << endl;
for_each(v.begin(), v.end(), print01);
cout << endl;
//替换
cout << "after replace: " << endl;
replace(v.begin(), v.end(), 0, 10);
for_each(v.begin(), v.end(), print01);
cout << endl;
}
3.replace_if
将区间内满足条件的元素 ,替换成指定元素。函数原型:replace_if(iterator beg,iterator end,_pred,newvalue);
c++
class myPlace
{
public:
bool operator()(int val)
{
return val < 7;//我的条件,小于7的都满足我需要替换的条件
}
};
void test03()
{
vector<int>v;
for (int i = 0; i < 10; i++)
{
v.push_back(i);
}
cout << "替换前:" << endl;
for_each(v.begin(), v.end(), print02());// 0 1 2 3 4 5 6 7 8 9
cout << endl;
//替换
cout << "替换后:" << endl;
replace_if(v.begin(), v.end(), myPlace(), 7);//所有满足myPlace条件的都将替换成7
for_each(v.begin(), v.end(), print02());// 7 7 7 7 7 7 7 7 8 9
cout << endl;
}
_Pred是谓词,也是我们需要写的替换条件
4.swap
互换两个容器中的元素 。函数原型:swap(container c1,container c2);
c++
void test04()
{
vector<int>v;
for (int i = 0; i < 10; i++)
{
v.push_back(i);
}
vector<int>v2;
for (int i = 100; i < 110; i++)
{
v2.push_back(i);
}
cout << "before swap:" << endl;
for_each(v.begin(), v.end(), print01);
cout << endl;
for_each(v2.begin(), v2.end(), print02());
cout << endl;
//交换
cout << "after swap:" << endl;
swap(v, v2);
for_each(v.begin(), v.end(), print01);
cout << endl;
for_each(v2.begin(), v2.end(), print02());
cout << endl;
}
两个容器必须是同一种类型,不需要留空间,二者大小直接交换
二、常用算术生成算法
算术生成算法属于小型算法,使用时应包含头文件 #include<numeric>
1.accumulate
计算区间内容器元素累计总和 。accumulate(iterator beg,iterator end,value);value为起始叠加值,即从什么开始累加
c++
void test05()
{
vector<int>v;
int sum = 0;
for (int i = 0; i <= 10; i++)
{
v.push_back(i);
sum += i;
}
int sum1 = accumulate(v.begin(), v.end(), 0);
cout << sum << endl;//55
cout << sum1 << endl;//55
}
应用:评委打分,累加分数,若value为0,则从0开始加,若value为100,则从100开始加,即容器内部元素总和加value为最终输出的值。
2.fill
向容器中填充指定的元素 。函数原型:fiil(iterator beg,iterator end,value);value为填充的值
c++
void test06()
{
vector<int>v;
v.resize(7);//指定容器大小,默认为0;现在是7个0
for_each(v.begin(), v.end(), print01);//0 0 0 0 0 0 0
cout << endl;
//后期重新填充
fill(v.begin(), v.end(), 6);
for_each(v.begin(), v.end(), print01);//6 6 6 6 6 6 6
cout << endl;
}
三、常用集合算法
1.set_intersection
求解两个容器的交集 。set_intersection(iterator beg1,iterator end1,iterator beg2,iterator end2,iterator dest);求解两个容器的交集,并将交集放在目标容器中dest
c++
void test07()
{
vector<int>v1;
for (int i = 0; i < 10; i++)
{
v1.push_back(i);
}
vector<int>v2;
for (int i = 5; i < 18; i++)
{
v2.push_back(i);
}
vector<int>v3;
v3.resize(min(v1.size(),v2.size()));
//交集最好的情况就是其中一个容器是完全包含在另一个容器中的,所以最大的交集个数为二者大小最小的
//获取交集
vector<int>::iterator pos = set_intersection(v1.begin(), v1.end(), v2.begin(), v2.end(), v3.begin());
//元素个数没有容器容量大的话,会以默认值0填充,所以我们会使用它返回的结束迭代器
for_each(v3.begin(), pos, print01);
cout << endl;
}
函数的返回值是一个迭代器,是求解的交集中的最后一个元素的位置。遍历时,就使用这个迭代器,两个源容器需要是有序的序列才可以
2.set_union
求两个集合的并集 。set_union(iterator beg1,iterator end1,iterator beg2,iterator end2,iterator dest);两个集合必须是有序序列
c++
void test08()
{
vector<int>v1;
for (int i = 0; i < 12; i++)
{
v1.push_back(i);
}
vector<int>v2;
for (int i = 6; i < 17; i++)
{
v2.push_back(i);
}
vector<int>v3;
v3.resize(v1.size()+v2.size());//最坏情况下,是两个容器内的元素都不相同,所以最大的是两个容器的大小和
vector<int>::iterator pos = set_union(v1.begin(), v1.end(), v2.begin(), v2.end(), v3.begin());
for_each(v3.begin(), pos, print01);//遍历结束在返回的容器结束迭代器位置,否则会以0补充
cout << endl;
}
返回的结果是一个迭代器 ,是求解的并集中的最后一个元素的位置
3.set_difference
求两个集合的差集 。set_difference(iterator beg1,iterator end1,iterator beg2,iterator end2,iterator dest);两个集合必须是有序的序列。求解两个容器的差集,第一个容器和第二个容器的差集是指第一个容器中没有出现在第二个容器中的元素
c++
void test09()
{
vector<int>v1;
for (int i = 0; i < 13; i++)
{
v1.push_back(i);
}
vector<int>v2;
for (int i = 7; i < 18; i++)
{
v2.push_back(i);
}
for_each(v1.begin(), v1.end(), print01);//0 1 2 3 4 5 6 7 8 9 10 11 12
cout << endl;
for_each(v2.begin(), v2.end(), print01);//7 8 9 10 11 12 13 14 15 16 17
cout << endl;
//求差集
cout << "v1和v2的差集:" << endl;
vector<int>v3;
v3.resize(max(v1.size(),v2.size()));
vector<int>::iterator pos = set_difference(v1.begin(), v1.end(), v2.begin(), v2.end(), v3.begin());
for_each(v3.begin(), pos, print01);//0 1 2 3 4 5 6
cout << endl;
}