C++ STL算法篇(二) day18
拷贝和修改算法
- copy: 区间拷贝
- copy_backward: 逆向拷贝
- remove:删除
- remove_copy: 删除另存
- remove_if:条件删除
- remove_copy_if:条件删除结果另存
- replace: 修改
- replace _copy: 修改结果另存
- replace_if:条件替换
- replace_copy_if:条件替换 ,结果另存
- iter_swap:迭代器交换
- swap:容器交换
- swap_ranges: 区间交换
- unique: 去重操作
- unique_copy: 去重结果另存
#include <iostream>
#include <algorithm>
#include <vector>
#include <list>
class student
{
public:
student(std::string name = "", int age = 0) :name(name), age(age) {}
std::string getName()const { return name; };
int getAge()const { return age; };
protected:
std::string name;
int age;
};
void CopyAlter()
{
int arr[5]{ 1,2,3,4,5 };
std::vector<int> vec;
copy(arr, arr + 5, std::back_inserter(vec));
copy(vec.begin(), vec.end(), std::ostream_iterator<int>(std::cout, " "));
std::cout << std::endl;
std::vector<int> rvec(vec.size());
std::copy_backward(vec.begin(), vec.end(), rvec.end());
copy(rvec.begin(), rvec.end(), std::ostream_iterator<int>(std::cout, " "));
std::cout << std::endl;
auto iter = remove(vec.begin(), vec.end(), 2);
std::cout << "size:" << vec.size() << std::endl;
copy(vec.begin(), vec.end(), std::ostream_iterator<int>(std::cout, " "));
std::cout << std::endl;
std::vector<int> rcopy;
remove_copy(vec.begin(), vec.end(), std::back_inserter(rcopy), 1);
copy(vec.begin(), vec.end(), std::ostream_iterator<int>(std::cout, " "));
std::cout << std::endl;
copy(rcopy.begin(), rcopy.end(), std::ostream_iterator<int>(std::cout, " "));
std::cout << std::endl;
std::vector<int> data = { 1,2,3,4,5,6,7,8,9 };
auto it = remove_if(data.begin(), data.end(),
[](const int& data) {return data % 2 == 0; }
);
copy(data.begin(), data.end(), std::ostream_iterator<int>(std::cout, " "));
std::cout << std::endl;
std::vector<int> maxData;
remove_copy_if(data.begin(), data.end(), std::back_inserter(maxData),
[](const int& data) {return data < 5; });
copy(maxData.begin(), maxData.end(), std::ostream_iterator<int>(std::cout, " "));
std::cout << std::endl;
std::replace(maxData.begin(), maxData.end(), 9, 999);
copy(maxData.begin(), maxData.end(), std::ostream_iterator<int>(std::cout, " "));
std::cout << std::endl;
std::vector<int> cMax;
std::replace_copy(maxData.begin(), maxData.end(), std::back_inserter(cMax), 999, 111);
copy(maxData.begin(), maxData.end(), std::ostream_iterator<int>(std::cout, " "));
std::cout << std::endl;
copy(cMax.begin(), cMax.end(), std::ostream_iterator<int>(std::cout, " "));
std::cout << std::endl;
std::replace_if(cMax.begin(), cMax.end(),
[](const int& data) {return data == 111; }, 222);
copy(cMax.begin(), cMax.end(), std::ostream_iterator<int>(std::cout, " "));
std::cout << std::endl;
std::vector<int> result;
std::replace_copy_if(cMax.begin(), cMax.end(), std::back_inserter(result),
[](const int& data) {return data == 222; }, 333);
copy(cMax.begin(), cMax.end(), std::ostream_iterator<int>(std::cout, " "));
std::cout << std::endl;
copy(result.begin(), result.end(), std::ostream_iterator<int>(std::cout, " "));
std::cout << std::endl;
std::vector<int> one = { 1,2,3,4,5,6,7,9 };
iter_swap(one.begin(), one.end() - 1);
copy(one.begin(), one.end(), std::ostream_iterator<int>(std::cout, " "));
std::cout << std::endl;
std::vector<int> two = { 11,22,33,44,55 };
swap_ranges(one.begin(), one.begin() + 3, two.begin());
copy(one.begin(), one.end(), std::ostream_iterator<int>(std::cout, " "));
std::cout << std::endl;
copy(two.begin(), two.end(), std::ostream_iterator<int>(std::cout, " "));
std::cout << std::endl;
std::string str = "sdfasdaddaaa21122xzxc2f******";
unique(str.begin(), str.end());
std::cout << str << std::endl;
std::string unstr;
unique_copy(str.begin(), str.end(), std::back_inserter(unstr));
std::cout << unstr << std::endl;
}
int main()
{
CopyAlter();
return 0;
}
- 运行结果
![在这里插入图片描述](https://img-blog.csdnimg.cn/49215c3f5f0c433f876e3fe00e69110e.png)
排序组合算法
- 全排列算法:
- next_permutation:从小到大
- prev_permutation:从大到小
- next_permutation只能获得上一个排列,如果要获得全排列,那么就需要先对数组进行升序排序,prev_permutation与next_permutation用法一样
- 定义如下
- next_permutaion(起始地址,末尾地址)
- next_permutaion(起始地址,末尾地址,自定义排序)
#include <iostream>
#include <algorithm>
#include <vector>
int main()
{
std::vector<int> vec{ 1,3,4,2 };
sort(vec.begin(), vec.end(), std::less<int>());
int index = 0;
do
{
index++;
std::cout << "第:" << index << "组合";
copy(vec.begin(), vec.end(), std::ostream_iterator<int>(std::cout, " "));
std::cout << std::endl;
} while (next_permutation(vec.begin(), vec.end()));
std::cout << std::endl;
sort(vec.begin(), vec.end(), std::greater<int>());
index = 0;
do
{
index++;
std::cout << "第:" << index << "组合";
copy(vec.begin(), vec.end(), std::ostream_iterator<int>(std::cout, " "));
std::cout << std::endl;
} while (prev_permutation(vec.begin(), vec.end()));
return 0;
}
- 运行结果
![在这里插入图片描述](https://img-blog.csdnimg.cn/cda023ad83ee4444a9b4f759ffc19765.png)
算术类算法
- 头文件:包含头文件 #include <numeric>
- accumulate:求和算法
- partial_sum:逐步求和
- inner_product:求积这个积是笛卡尔积,一般用在矩阵乘积中
- adjacent_difference:逐步求差
#include <iostream>
#include <algorithm>
#include <vector>
#include <numeric>
int main()
{
std::vector<int> vec{ 1,3,2,4,5,6 };
int sum = 0;
sum = accumulate(vec.begin(), vec.end(), sum);
std::cout << sum << std::endl;
std::vector<int> vec2;
partial_sum(vec.begin(), vec.end(), std::back_inserter(vec2));
copy(vec2.begin(), vec2.end(), std::ostream_iterator<int>(std::cout, " "));
std::cout << std::endl;
std::vector<int> one{ 1,2,3 };
std::vector<int> two{ 4,5,6 };
std::cout << inner_product(one.begin(), one.end(), two.begin(), 0) << std::endl;
std::vector<int> data{ 1,3,4,2 };
std::vector<int> temp;
adjacent_difference(data.begin(), data.end(), std::back_inserter(temp));
copy(temp.begin(), temp.end(), std::ostream_iterator<int>(std::cout, " "));
std::cout << std::endl;
return 0;
}
- 运行结果
![在这里插入图片描述](https://img-blog.csdnimg.cn/936932a9660c4640bfa7463f6b92d5ed.png)
关系算法
- equal:比较算法
- includes:是否包含关系
- lexicographical_compare: 比较序列
- max:最大值,max_element迭代器版
- min:最小值 ,min_element迭代器版
- mismatch: 查找第一次不同的地方
#include <iostream>
#include <algorithm>
#include <vector>
#include <numeric>
int main()
{
std::vector<int> one{ 1,2,3,4 };
std::vector<int> two{ 1,3,2,4 };
std::cout << std::boolalpha << equal(one.begin(), one.end(), two.begin(), two.end()) << std::endl;
std::vector<int> data{ 2,3,4 };
std::cout << std::boolalpha << includes(one.begin(), one.end(), data.begin(), data.end()) << std::endl;
std::string str1 = "1Xiaogua";
std::string str2 = "2Dagua";
std::cout << lexicographical_compare(str1.begin(), str1.end(),
str2.begin(), str2.end()) << std::endl;
if (str1 < str2)
{
std::cout << "不如这个True" << std::endl;
}
std::cout << std::max(1, 2) << std::endl;
std::cout << std::min(1, 2) << std::endl;
std::cout << *std::max_element(one.begin(), one.end()) << std::endl;
std::cout << *std::min_element(two.begin(), two.end()) << std::endl;
auto result= mismatch(one.begin(), one.end(), two.begin(), two.end());
std::cout << "one容器中与two容器不同的位置:" << *result.first << std::endl;
std::cout << "one容器与two容器中不同的位置:" << *result.second << std::endl;
return 0;
}
- 运行结果
![在这里插入图片描述](https://img-blog.csdnimg.cn/a8c10dc12b5f4724817495363b011ee6.png)