C++ 算法包(find/find_if,for_each,transform,count/count_if,merge,sort,copy,replace)简单使用

上一篇 STL 包

记得添加算法包依赖哦~

//算法包依赖
#include <algorithm>
//set 容器依赖
#include <set>
//vector 容器依赖
#include <vector>

find和 find_if查找容器元素

find_if代码:

	set<string, less<string>> set1;
    set1.insert(set1.begin(), "set元素 1");
    set1.insert(set1.begin(), "set元素 2");
    set1.insert(set1.begin(), "set元素 3");
    set1.insert(set1.begin(), "set元素 4");
    set1.insert(set1.begin(), "set元素 5");

    //TODO find_if 查找容器中的元素   (bind2nd为函数适配器)
    cout << endl << endl << "find_if打印:" << endl;
    
    auto it = find_if(set1.begin(), set1.end(), bind2nd(equal_to<string>(), "set元素 2"));

    if (!it->empty()) {
        cout << "find_if找到了" << *it << endl;
    } else {
        cout << "find_if未找到" << endl;
    }

find_if:

  • 参数一:容器开始位置
  • 参数二:容器结束位置
  • 参数三:bind2nd是函数适配器 equal_to<>() 是系统自带的仿函数

find_if 第三个参数bind2nd()是函数适配器,系统会将"set元素 2"适配到equal_to的第二个值上进行比较

系统自带的仿函数常用的有:

  • equal_to<int>() 判断 x = y
  • less<int>() 判断 x < y
  • greater<int>() 判断 x > y

运行结果为:

find_if打印:
find_if找到了set元素 2

find 代码:

// TODO find (查找元素功能) 没有自定义仿函数
    auto findp = find(set1.begin(),set1.end(),"set元素 1");
    if (findp!= set1.end()) {
        cout << "find找到了" << *findp << endl;
    } else {
        cout << "find未找到" << endl;
    }

使用和 find_if 效果一样,不过 find 不需要使用仿函数,使用更加简单

for_each 用来遍历元素

	set<string, less<string>> set1;
    set1.insert(set1.begin(), "set元素 1");
    set1.insert(set1.begin(), "set元素 2");
    set1.insert(set1.begin(), "set元素 3");
    set1.insert(set1.begin(), "set元素 4");
    set1.insert(set1.begin(), "set元素 5");

遍历方式一:

void show_for_each(string pInt) {
    cout << "for_each方式一元素为:" << pInt << endl;
}

for_each(set1.begin(), set1.end(), show_for_each);

for_each参数:

  • 参数一:容器开始位置
  • 参数二:容器结束位置
  • 参数三: 结果返回

方式一采用了普通函数返回

运行结果为:

for_each方式一元素为:set元素 1
for_each方式一元素为:set元素 2
for_each方式一元素为:set元素 3
for_each方式一元素为:set元素 4
for_each方式一元素为:set元素 5

遍历方式二:

class ShowForEach {
public:
    void operator()(string pInt) {
        cout << "for_each方式二元素为:" << pInt << endl;
    }
};

for_each(set1.begin(), set1.end(), ShowForEach());

方式二采用了仿函数的方式遍历所有元素

transform (修改容器内的元素)

	//仿函数
	class ShowTransform {
	public:
	    int operator()(string str) {
	       cout << "transform修改后的元素为:" << str + "修改" << endl;
	    }
	};

	vector<string> vector1;
    vector1.insert(vector1.begin(), "vector11 元素1");
    vector1.insert(vector1.begin(), "vector12 元素2");
    vector1.insert(vector1.begin(), "vector13 元素3");
	
	transform(vector1.begin(), vector1.end(), vector1.begin(), ShowTransform());

transform参数:

  • 参数一:容器开始位置
  • 参数二:容器结束位置
  • 参数三:容器被修改后要新存放的位置(可以新创建一个容器用来接收,这里我偷懒了就使用这个吧原来值覆盖掉即可)
  • 参数四:自定义仿函数,用来接收返回值

运行结果:

transform修改后的元素为:vector13 元素3修改
transform修改后的元素为:vector12 元素2修改
transform修改后的元素为:vector11 元素1修改

count 和 count_if 统计容器内某一个元素的值

int number;
    vector<int> vector2;
    vector2.insert(vector2.begin(), 1);
    vector2.insert(vector2.begin(), 2);
    vector2.insert(vector2.begin(), 2);
    vector2.insert(vector2.begin(), 2);
    vector2.insert(vector2.begin(), 34);
    vector2.insert(vector2.begin(), 34);
    vector2.insert(vector2.begin(), 4);

    number = count(vector2.begin(), vector2.end(), 2);

    cout << "count元素个数为:" << number << endl;
    number = count_if(vector2.begin(), vector2.end(), bind2nd(equal_to<int>(), 34));
    cout << "countif元素个数为:" << number << endl;

count 参数:

  • 参数一:容器开始位置
  • 参数二:容器结束位置
  • 参数三:要统计容器的值

count_if 参数:

  • 参数一:容器开始位置
  • 参数二:容器结束位置
  • 参数三:函数适配器

这个用法和 find/find_if 用法类似,这里就不说了

运行结果为:

count元素个数为:3
countif元素个数为:2

merge 合并容器

    vector<int> vector3;
    vector3.insert(vector3.begin(), 41);
    vector3.insert(vector3.begin(), 42);

    vector<int> vector4;
    vector4.insert(vector4.begin(), 43);
    vector4.insert(vector4.begin(), 44);
    vector4.insert(vector4.begin(), 45);

    //新的容器
    vector<int> vector5;
    //设置新的容器大小
    vector5.resize(vector3.size() + vector4.size());
    /**
     * 参数五:存放新的容器的首地址
     */
    merge(vector3.begin(), vector3.end(), vector4.begin(), vector4.end(), vector5.begin());
    
	for (auto it = vector5.begin(); it != vector5.end(); it++) {
        cout << "merge新容器为:" << *it << endl;
    }

merge 参数:

  • 参数一:A 容器开始位置
  • 参数二:A 容器结束位置
  • 参数三:B 容器开始位置
  • 参数四:B 容器结束位置
  • 参数五:新容器的开始位置

运行结果为:

merge新容器为:42
merge新容器为:41
merge新容器为:45
merge新容器为:44
merge新容器为:43

sort 容器排序

	vector<int> vector6;
    vector6.insert(vector6.begin(), 3);
    vector6.insert(vector6.begin(), 44);
    vector6.insert(vector6.begin(), 424);
    vector6.insert(vector6.begin(), 14);
    vector6.insert(vector6.begin(), 45);

    //从小到大排序
//    sort(vector6.begin(),vector6.end(),less<int>());
    //从大到小排序
    sort(vector6.begin(), vector6.end(), greater<int>());
    for (auto it = vector6.begin(); it != vector6.end(); it++) {
        cout << "sort排序为:" << *it << endl;
    }

sort 参数:

  • 参数一:容器开始位置
  • 参数二:容器结束位置
  • 参数三:仿函数(这里使用系统的仿函数)

less<int>为从大到小排序 greater<int>为从小到大排序:

运行结果为:

sort排序为:424
sort排序为:45
sort排序为:44
sort排序为:14
sort排序为:3

copy 容器拷贝

	vector<int> vector8;
    vector8.insert(vector8.begin(), 3);
    vector8.insert(vector8.begin(), 44);
    vector8.insert(vector8.begin(), 424);
    vector8.insert(vector8.begin(), 14);
    vector8.insert(vector8.begin(), 45);
    //新的容器
    vector<int> vector9;
    //设置容器大小
    vector9.resize(vector8.size());
    copy(vector8.begin(), vector8.end(), vector9.begin());

    for (auto it = vector9.begin(); it != vector9.end(); it++) {
        cout << "copy排序为:" << *it << endl;
    }

copy 参数:

  • 参数一:容器开始位置
  • 参数二:容器结束位置
  • 参数三:存放新容器开始位置

运行结果为:

copy排序为:45
copy排序为:14
copy排序为:424
copy排序为:44
copy排序为:3

replace 替换容器内的某一个元素

vector<int> vector10;
    vector10.insert(vector10.begin(), 3);
    vector10.insert(vector10.begin(), 44);
    vector10.insert(vector10.begin(), 424);
    vector10.insert(vector10.begin(), 14);
    vector10.insert(vector10.begin(), 45);

    
    replace(vector10.begin(), vector10.begin() + vector10.size(), 424, 111);

    for (auto it = vector10.begin(); it != vector10.end(); it++) {
        cout << "replace排序为:" << *it << endl;
    }

replace 参数:

  • 参数一:容器开始搜索位置
  • 参数二:容器结束搜索位置(这里使用 begin 第 1 个搜索+ size() 表示搜索容器内所有的元素)
  • 参数三:搜索的值
  • 参数四:如果搜索范围内有搜索的值,则替换为该参数

运行结果:

replace排序为:45
replace排序为:14
replace排序为:111
replace排序为:44
replace排序为:3

上一篇:C++ CLT中的容器以及简单谓词~

原创不易,您的点赞就是对我最大的支持!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
merge_sort()是一种常用的排序算法,它采用分治法的思想,将一个大问题分解为多个小问题来解决。具体步骤如下: 1. 分解:将待排序的数组不断地二分,直到每个子数组只有一个元素。 2. 合并:将相邻的两个子数组按照顺序合并,形成一个有序的子数组。 3. 重复合并:不断地重复合并相邻的子数组,直到最终得到一个完全有序的数组。 下面是C++merge_sort()函数的一个示例实现: ```cpp // 合并两个有序数组 void merge(int arr[], int left, int mid, int right) { int n1 = mid - left + 1; int n2 = right - mid; // 创建临时数组 int L[n1], R[n2]; // 将数据复制到临时数组 for (int i = 0; i < n1; i++) { L[i] = arr[left + i]; } for (int j = 0; j < n2; j++) { R[j] = arr[mid + 1 + j]; } // 合并临时数组 int i = 0, j = 0, k = left; while (i < n1 && j < n2) { if (L[i] <= R[j]) { arr[k] = L[i]; i++; } else { arr[k] = R[j]; j++; } k++; } // 复制剩余元素 while (i < n1) { arr[k] = L[i]; i++; k++; } while (j < n2) { arr[k] = R[j]; j++; k++; } } // 归并排序 void merge_sort(int arr[], int left, int right) { if (left < right) { int mid = left + (right - left) / 2; // 分解为子问题 merge_sort(arr, left, mid); merge_sort(arr, mid + 1, right); // 合并子问题的解 merge(arr, left, mid, right); } } ``` 这是一个递归实现的merge_sort()函数,它通过不断地将数组分解为更小的子数组,并将它们合并成有序数组来完成排序。你可以调用merge_sort()函数来对一个整数数组进行排序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

s10g

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值