网易首页 > 网易号 > 正文 申请入驻

C++标准库中的头文件提供的常用算法

0
分享至

在C++中,头文件提供了一系列用于操作序列(如数组、向量、列表等)的算法。这些算法可以极大地简化数据处理任务,提高代码的可读性和可维护性。本文将详细介绍头文件中提供的一些常用算法,并通过代码示例来解释其用法。



一、查找算法 1. std::find

std::find是一个线性查找算法,用于在序列中查找特定元素。

#include #include #include int main() {    std::vector vec = {1, 2, 3, 4, 5};    int val = 3;        // 使用std::find查找val在vec中的位置    auto it = std::find(vec.begin(), vec.end(), val);        if (it != vec.end()) {        std::cout << "找到元素 " << val << " 在位置 " << std::distance(vec.begin(), it) << std::endl;    } else {        std::cout << "未找到元素 " << val << std::endl;    }        return 0;}
2. std::find_if

std::find_if允许你根据特定条件在序列中查找元素。

#include #include #include bool is_even(int i) {    return (i % 2) == 0;}int main() {    std::vector vec = {1, 2, 3, 4, 5};        // 使用std::find_if查找第一个偶数元素    auto it = std::find_if(vec.begin(), vec.end(), is_even);        if (it != vec.end()) {        std::cout << "找到第一个偶数 " << *it << " 在位置 " << std::distance(vec.begin(), it) << std::endl;    } else {        std::cout << "未找到偶数" << std::endl;    }        return 0;}
二、排序算法 1. std::sort

std::sort是一个高效的排序算法,通常实现为快速排序、堆排序或归并排序的混合体。

#include #include #include int main() {    std::vector vec = {5, 2, 3, 1, 4};        // 使用std::sort对vec进行排序    std::sort(vec.begin(), vec.end());        // 输出排序后的向量    for (int i : vec) {        std::cout << i << " ";    }    std::cout << std::endl;        return 0;}
2. std::stable_sort

std::stable_sort是一种稳定的排序算法,即相等元素的相对顺序在排序后保持不变。

// 用法与std::sort类似,但保证排序的稳定性。
三、修改序列算法 1. std::for_each

std::for_each用于对序列中的每个元素执行特定操作。

#include #include #include void print(int i) {    std::cout << i << " ";}int main() {    std::vector vec = {1, 2, 3, 4, 5};        // 使用std::for_each打印vec中的每个元素    std::for_each(vec.begin(), vec.end(), print);    std::cout << std::endl;        return 0;}
2. std::transform

std::transform用于对序列中的每个元素执行某种转换,并将结果存储到另一个序列中。

#include #include #include #include  // 为了使用std::plus等函数对象int main() {    std::vector vec = {1, 2, 3, 4, 5};    std::vector result(vec.size());        // 使用std::transform将vec中的每个元素加倍并存储到result中    std::transform(vec.begin(), vec.end(), result.begin(), [](int x) { return x * 2; });        // 输出转换后的结果向量    for (int i : result) {        std::cout << i << " ";    }    std::cout << std::endl;        return 0;}
四、其他常用算法 1. std::unique_copy

std::unique_copy算法用于从一个输入序列中复制不重复的元素到一个输出序列。这个算法假定输入序列是已排序的,因为只有已排序的序列才能保证相邻的重复元素被识别并去除。

#include #include #include #include int main() {    std::vector source = {1, 2, 2, 3, 4, 4, 4, 5};    std::vector destination;    std::unique_copy(source.begin(), source.end(), std::back_inserter(destination));    // 输出目标向量,应不包含重复的元素    for (int val : destination) {        std::cout << val << " ";    }    std::cout << std::endl;    return 0;}

注意:在这个例子中,std::back_inserter是一个插入迭代器,它将新元素添加到destination容器的末尾。

2. std::merge

std::merge算法用于合并两个已排序的序列,结果也是一个已排序的序列。

#include #include #include #include int main() {    std::vector vec1 = {1, 3, 5, 7};    std::vector vec2 = {2, 4, 6, 8};    std::vector result(vec1.size() + vec2.size());    std::merge(vec1.begin(), vec1.end(), vec2.begin(), vec2.end(), result.begin());    // 输出合并后的结果向量    for (int val : result) {        std::cout << val << " ";    }    std::cout << std::endl;    return 0;}
3. 集合算法:std::set_difference, std::set_intersection, std::set_union, std::set_symmetric_difference

这些算法用于在两个已排序的序列之间执行集合操作。

  • std::set_difference:计算两个已排序范围的差集。
  • std::set_intersection:计算两个已排序范围的交集。
  • std::set_union:计算两个已排序范围的并集。
  • std::set_symmetric_difference:计算两个已排序范围的对称差集(即属于第一个范围但不属于第二个范围,以及属于第二个范围但不属于第一个范围的所有元素)。

下面是std::set_union的一个例子:

#include #include #include #include int main() {    std::vector vec1 = {1, 2, 3, 4, 5};    std::vector vec2 = {4, 5, 6, 7, 8};    std::vector union_result;    std::set_union(vec1.begin(), vec1.end(), vec2.begin(), vec2.end(), std::back_inserter(union_result));    // 输出并集结果向量    for (int val : union_result) {        std::cout << val << " ";    }    std::cout << std::endl;    return 0;}

对于其他集合算法,使用方法是类似的,只是调用的函数名不同,以及它们处理集合运算的方式不同。这些算法在处理大量数据时可以显著提高效率,因为它们都利用了输入数据已排序的特性来优化性能。

五、其他值得注意的算法

除了之前提到的算法外,C++标准库还提供了许多其他有用的算法,这些算法在处理各种编程任务时都非常实用。

1. std::partition 和 std::stable_partition

std::partition 和 std::stable_partition 算法用于根据给定谓词对序列进行划分,使得满足谓词的元素出现在不满足谓词的元素之前。std::stable_partition 还保持了等价元素的相对顺序。

2. std::nth_element

std::nth_element 算法用于对序列进行部分排序,使得第n个位置的元素在排序后处于它在完全排序序列中的位置,且该位置左边的所有元素都小于或等于它,右边的所有元素都大于或等于它。

3. std::rotate 和 std::rotate_copy

std::rotate 算法用于将序列中的元素循环左移或右移,而 std::rotate_copy 则在旋转的同时将结果复制到一个新的序列中。

4. std::remove 和 std::remove_if

std::remove 算法用于从序列中移除所有等于给定值的元素,而 std::remove_if 则根据给定的谓词来移除元素。这两个算法并不实际删除元素,而是将不需要删除的元素移动到序列的前面,并返回一个迭代器指向新的序列末尾。

5. std::lower_bound 和 std::upper_bound

std::lower_bound 和 std::upper_bound 算法用于在已排序的序列中查找给定值的下界和上界。下界是指不小于给定值的第一个元素,而上界是指大于给定值的第一个元素。

6. std::inplace_merge

std::inplace_merge 算法用于将两个相邻的已排序序列合并为一个已排序序列。这个算法在需要合并多个已排序子序列时非常有用。

7. std::includes, std::set_difference, std::set_intersection, 和 std::set_union

这些算法用于执行集合操作,如判断一个集合是否包含另一个集合、计算两个集合的差集、交集和并集等。这些操作在处理集合数据时非常有用。

8. std::for_each, std::transform, 和 std::accumulate

这些算法用于对序列中的每个元素执行某种操作。std::for_each 对每个元素执行给定的操作,std::transform 将一个序列中的元素转换为另一个序列中的元素,而 std::accumulate 则计算序列中元素的累积和或其他二元操作的累积结果。

总的来说,C++标准库提供了丰富的算法工具,可以帮助开发者更加高效地处理各种数据结构和序列操作任务。这些算法不仅功能强大,而且经过高度优化,能够在各种场景下提供出色的性能表现。

#头条创作挑战赛#​

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
男生常见体型的9种标准,你属于哪一种?兄弟!

男生常见体型的9种标准,你属于哪一种?兄弟!

四象八卦
2024-05-23 16:47:31
欧联悲喜夜!亚特兰大首夺冠军,勒沃库森首败,阿隆索3冠王梦碎

欧联悲喜夜!亚特兰大首夺冠军,勒沃库森首败,阿隆索3冠王梦碎

侃球熊弟
2024-05-23 03:43:46
突发跳水!A股又上热搜

突发跳水!A股又上热搜

中国基金报
2024-05-23 11:16:53
葛荟婕炮轰汪峰:有本事再生一个!李巧隔空回应:汪峰很好我超爱

葛荟婕炮轰汪峰:有本事再生一个!李巧隔空回应:汪峰很好我超爱

娱乐的小灶
2024-05-23 16:37:16
风来了,赖清德不再叫我们中国,而是大陆

风来了,赖清德不再叫我们中国,而是大陆

洋洋说史咯
2023-10-23 16:15:17
苏联大清洗的来龙去脉:斯大林处决了60万人,这件事究竟是对是错

苏联大清洗的来龙去脉:斯大林处决了60万人,这件事究竟是对是错

拙言问史
2024-05-22 15:18:28
大学校园兴起“奶头乐”,不少大学生深陷其中,家长却浑然不知!

大学校园兴起“奶头乐”,不少大学生深陷其中,家长却浑然不知!

财经要参
2024-05-23 08:18:49
定了!2024年退休人员预计补发“2笔钱”,有人一次性补了上千元

定了!2024年退休人员预计补发“2笔钱”,有人一次性补了上千元

天下纵览
2024-05-23 13:00:53
出人意料,英国要提前大选

出人意料,英国要提前大选

寰宇大观察
2024-05-23 10:32:45
莱希坠机遇难,布林肯称其死将让伊朗人民“过得更好”

莱希坠机遇难,布林肯称其死将让伊朗人民“过得更好”

小宇将史
2024-05-22 19:51:39
官方回复!成都最知名大市场,确定要拆!

官方回复!成都最知名大市场,确定要拆!

暖心的小屋
2024-05-23 18:08:08
武统”台湾易如反掌?解放军旅长:两栖作战会十分惨烈,流血难免

武统”台湾易如反掌?解放军旅长:两栖作战会十分惨烈,流血难免

临床饮冰
2024-02-28 09:50:35
真被张召忠说中了?掏空国库建造的2艘航母,如今彻底沦为废铁

真被张召忠说中了?掏空国库建造的2艘航母,如今彻底沦为废铁

高山非凡创作
2024-05-16 07:48:51
5月23日俄乌最新:乌克兰边境的战术性核武演习

5月23日俄乌最新:乌克兰边境的战术性核武演习

西楼饮月
2024-05-23 15:00:03
A股:股市或将迎来大幅下跌

A股:股市或将迎来大幅下跌

生活中的栗子
2024-05-23 09:54:03
杨洁、郭彦洪、李贵富、李建忠,接连被查!

杨洁、郭彦洪、李贵富、李建忠,接连被查!

鲁中晨报
2024-05-21 19:47:04
猛涨!一小区怒卖85套!成都二手房卖疯了!

猛涨!一小区怒卖85套!成都二手房卖疯了!

科学发掘
2024-05-23 18:08:39
女市委书记高速路上被警车别停,两名便衣下车对其进行搜身揩油

女市委书记高速路上被警车别停,两名便衣下车对其进行搜身揩油

神奇的锤子
2024-05-19 14:16:07
暴雷!多地门店突然关门,老板疑跑路,业主800万血汗钱打水漂

暴雷!多地门店突然关门,老板疑跑路,业主800万血汗钱打水漂

品牌营销官
2024-05-22 19:18:32
要告诉你的亲人:未来几年,千万不要“得罪”这4类人

要告诉你的亲人:未来几年,千万不要“得罪”这4类人

舒山有鹿
2024-05-22 12:02:39
2024-05-23 20:24:49
鲨鱼编程
鲨鱼编程
懂点技术,懂点编程
441文章数 154关注度
往期回顾 全部

科技要闻

黄仁勋业绩会万字实录:我们的压力太大了

头条要闻

东部战区位台岛周边演习 三个罕见表述透露重要信号

头条要闻

东部战区位台岛周边演习 三个罕见表述透露重要信号

体育要闻

CBA最有价值球员,为何在总决赛迷失?

娱乐要闻

大S儿子被学校退学,张兰称孙子没人管

财经要闻

九鼎金租减值罗生门:郑州银行藏雷?

汽车要闻

上汽大通大家7超混/大家9超混将于6月7日正式上市

态度原创

时尚
房产
数码
公开课
军事航空

翻看日杂才发现:今年流行“项链叠戴、小包配大包”,时髦又高级

房产要闻

信号!海南这个区域开始鼓励企业购买安居房!

数码要闻

小米米家前开盖登机箱 20 英寸上市:支持干湿分离,售价 449 元

公开课

近视只是视力差?小心并发症

军事要闻

以军继续杰宁攻势 巴武装组织打击以目标

无障碍浏览 进入关怀版