0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

C++入门之通用算法

jf_78858299 来源:QStack 作者:月下西楼 2023-05-17 09:40 次阅读

C++ 是一种强大的编程语言,它提供了许多通用算法,可以用于各种容器类型。这些算法是通过迭代器来操作容器中的元素,因此它们是通用的,可以用于不同类型的容器。在本篇博客中,我们将详细介绍 C++ 的通用算法。

std::sort()

std::sort() 是 C++ 中最常用的算法之一,它可以对容器中的元素进行排序。该算法使用快速排序算法实现,时间复杂度为 O(n log n)。以下是一个使用 std::sort() 对数组进行排序的示例:

#include 
#include 

int main() {
    int arr[] = { 3, 1, 4, 1, 5, 9, 2, 6, 5, 3 };
    int n = sizeof(arr) / sizeof(arr[0]);

    std::sort(arr, arr + n);

    for (int i = 0; i < n; i++) {
        std::cout << arr[i] << " ";
    }
    std::cout << std::endl;

    return 0;
}

在上面的示例中,我们使用 std::sort() 对数组 arr 进行排序,并使用循环打印排序后的结果。

std::find()

std::find() 可以在容器中查找指定的元素。该算法返回一个迭代器,指向第一个匹配的元素。如果没有找到匹配的元素,则返回容器的 end() 迭代器。以下是一个使用 std::find() 查找向量中的元素的示例:

#include 
#include 
#include 

int main() {
    std::vector<int> vec = { 3, 1, 4, 1, 5, 9, 2, 6, 5, 3 };
    int x = 5;

    auto it = std::find(vec.begin(), vec.end(), x);

    if (it != vec.end()) {
        std::cout << "Found " << x << " at position " << it - vec.begin() << std::endl;
    } else {
        std::cout << "Not found" << std::endl;
    }

    return 0;
}

在上面的示例中,我们使用 std::find() 在向量 vec 中查找元素 x,并打印结果。

std::accumulate()

std::accumulate() 可以计算容器中元素的总和。该算法需要两个迭代器和一个初始值作为参数。以下是一个使用 std::accumulate() 计算数组元素总和的示例:

#include 
#include 

int main() {
    int arr[] = { 3, 1, 4, 1, 5, 9, 2, 6, 5, 3 };
    int n = sizeof(arr) / sizeof(arr[0]);

    int sum = std::accumulate(arr, arr + n, 0);

    std::cout << "Sum: " << sum << std::endl;

    return 0;
}

在上面的示例中,我们使用 std::accumulate() 计算数组 arr 中元素的总和,并打印结果。

std::transform()

std::transform() 可以对容器中的元素进行转换。该算法需要两个迭代器和一个转换函数作为参数。以下是一个使用 std::transform() 将数组中的元素乘以 2 的示例:

#include 
#include 

int main() {
    int arr[] = { 3, 1, 4, 1, 5, 9, 2, 6, 5, 3 };
    int n = sizeof(arr) / sizeof(arr[0]);

    std::transform(arr, arr + n, arr, [](int x) { return x * 2; });

    for (int i = 0; i < n; i++) {
        std::cout << arr[i] << " ";
    }
    std::cout << std::endl;

    return 0;
}

在上面的示例中,我们使用 std::transform() 将数组 arr 中的元素乘以 2,并使用循环打印结果。

std::copy()

std::copy() 可以将容器中的元素复制到另一个容器中。该算法需要两个迭代器和一个目标容器的迭代器作为参数。以下是一个使用 std::copy() 将数组中的元素复制到向量中的示例:

#include 
#include 
#include 

int main() {
    int arr[] = { 3, 1, 4, 1, 5, 9, 2, 6, 5, 3 };
    int n = sizeof(arr) / sizeof(arr[0]);

    std::vector<int> vec(n);
    std::copy(arr, arr + n, vec.begin());

    for (int i = 0; i < n; i++) {
        std::cout << vec[i] << " ";
    }
    std::cout << std::endl;

    return 0;
}

在上面的示例中,我们使用 std::copy() 将数组 arr 中的元素复制到向量 vec 中,并使用循环打印结果。

std::reverse()

std::reverse() 可以反转容器中的元素顺序。该算法需要两个迭代器作为参数。以下是一个使用 std::reverse() 反转数组中的元素顺序的示例:

#include 
#include 

int main() {
    int arr[] = { 3, 1, 4, 1, 5, 9, 2, 6, 5, 3 };
    int n = sizeof(arr) / sizeof(arr[0]);

    std::reverse(arr, arr + n);

    for (int i = 0; i < n; i++) {
        std::cout << arr[i] << " ";
    }
    std::cout << std::endl;

    return 0;
}

在上面的示例中,我们使用 std::reverse() 反转数组 arr 中的元素顺序,并使用循环打印结果。

std::unique()

std::unique() 可以从容器中删除重复的元素。该算法需要两个迭代器作为参数,并返回一个迭代器,指向不重复的元素的末尾。以下是一个使用 std::unique() 删除向量中重复元素的示例:

#include 
#include 
#include 

int main() {
    std::vector<int> vec = { 3, 1, 4, 1, 5, 9, 2, 6, 5, 3 };
    std::sort(vec.begin(), vec.end());

    auto it = std::unique(vec.begin(), vec.end());
    vec.erase(it, vec.end());

    for (int i = 0; i < vec.size(); i++) {
        std::cout << vec[i] << " ";
    }
    std::cout << std::endl;

    return 0;
}

在上面的示例中,我们使用 std::unique() 删除向量 vec 中的重复元素,并使用循环打印结果。

std::for_each()

std::for_each() 可以对容器中的每个元素执行指定的操作。该算法需要两个迭代器和一个函数对象作为参数。以下是一个使用 std::for_each() 对数组中的元素进行平方的示例:

#include 
#include 

int main() {
    int arr[] = { 3, 1, 4, 1, 5, 9, 2, 6, 5, 3 };
    int n = sizeof(arr) / sizeof(arr[0]);

    std::for_each(arr, arr + n, [](int& x) { x *= x; });

    for (int i = 0; i < n; i++) {
        std::cout << arr[i] << " ";
    }
    std::cout << std::endl;

    return 0;
}

在上面的示例中,我们使用 std::for_each() 对数组 arr 中的元素进行平方,并使用循环打印结果。

最后

C++ 的通用算法可以大大简化编写 C++ 程序的过程,因为它们提供了一种通用的方法来处理容器中的元素,而不需要编写特定于容器类型的代码。此外,这些算法已经经过优化,因此它们通常比手动编写的代码更快、更可靠。在实际编程中,我们应该熟练掌握这些算法,并根据需要选择合适的算法来处理容器中的元素。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 编程语言
    +关注

    关注

    10

    文章

    1928

    浏览量

    34536
  • 容器
    +关注

    关注

    0

    文章

    492

    浏览量

    22025
  • C++
    C++
    +关注

    关注

    21

    文章

    2096

    浏览量

    73447
收藏 人收藏

    评论

    相关推荐

    C++STL算法(二)

    C++STL算法(二)
    的头像 发表于 07-18 14:49 944次阅读
    <b class='flag-5'>C++</b><b class='flag-5'>之</b>STL<b class='flag-5'>算法</b>(二)

    c++STL算法(三)

    c++STL算法(三)
    的头像 发表于 07-18 15:00 1192次阅读
    <b class='flag-5'>c++</b><b class='flag-5'>之</b>STL<b class='flag-5'>算法</b>(三)

    C++文件操作

    C++文件操作
    的头像 发表于 07-21 10:52 1066次阅读
    <b class='flag-5'>C++</b><b class='flag-5'>之</b>文件操作

    c++算法库的移植问题

    目前有一个算法库 用的c++  用ccs在dsp上可以调试 现在希望把库放在8168的dsp上  需要将c++转换成c 有个工具 mmCC C++-
    发表于 06-21 13:14

    C++入门基础教程大全

    C++入门基础教程大全 C++是一种面向对象的编程语言,但如果系统没有采用面向对象的技术,C++只能作为面向过程的语言来使用.
    发表于 05-29 10:25 0次下载

    C++数值算法电子书

    C++数值算法电子书在每个专题中,不仅对每种算法给出了数学分析和比较,而且根据作者的经验给出了评论和建议,并在此基础上给出了 C++ 编程的具体程序,很适合广大电子爱好的学
    发表于 07-15 17:46 0次下载
    <b class='flag-5'>C++</b>数值<b class='flag-5'>算法</b>电子书

    C++ 入门自学教程

    C++ 入门自学教程从入门知识开始讲起,比较有利于初学者入门掌握,比较好懂,能够对C++有一个全面认识
    发表于 11-17 10:36 0次下载

    Visual C++编程入门视频

    Visual C++编程入门视频!资料来源网络,如有侵权,敬请见谅
    发表于 11-20 15:10 6次下载

    c++入门经典习题集

    让大家全方位傻瓜式学习大话设计模式(3.45MB)c++入门经典习题集+多年积累的类库。
    发表于 07-13 15:11 2次下载

    c++入门教程书籍c++PrimerPlus》第六版电子教材免费下载

    C++是在C语言基础上开发的一种集面向对象编程、通用编程和传统的过程化编程于一体的编程语言,是C语言的超集。本书是根据2003年的ISO/ANSI
    发表于 09-11 08:00 0次下载

    C++入门教程之C++程序设计的课件资料免费下载

    本文档的主要内容详细介绍的是C++入门教程之C++程序设计的课件资料免费下载主要内容包括了:1. 认识C++2. C++的现状和发展3.
    发表于 12-07 08:00 33次下载
    <b class='flag-5'>C++</b><b class='flag-5'>入门</b>教程之<b class='flag-5'>C++</b>程序设计的课件资料免费下载

    C++设计新思维-泛型编程与设计应用

    C++设计新思维-泛型编程与设计应用
    发表于 11-16 15:59 3次下载

    C++学习笔记c++的基本认识

    自这篇文章我们即将开始C++的奇幻之旅,其内容主要是读C++ Primer的总结和笔记,有兴趣可以找原版书看看,对于学习C++还是有很大帮助的。这篇文章将从一个经典的程序开始介绍C++
    的头像 发表于 03-17 13:57 688次阅读

    C++入门string

    前一篇文章我们已经了解了C++中的基本类型,C++还提供了很多抽象数据类型,例如字符串string,string包含多个字符,以及可变长度的vector,vector可以包含多个同一类型的对象
    的头像 发表于 03-17 13:58 528次阅读

    C++之父新作带你勾勒现代C++地图

    为了帮助大家解决这些痛点问题,让大家领略现代C++美,掌握其中的精髓,更好地使用C++C++之父Bjarne Stroustrup坐不住了,他亲自操刀写就了这本《
    的头像 发表于 10-30 16:35 773次阅读
    <b class='flag-5'>C++</b>之父新作带你勾勒现代<b class='flag-5'>C++</b>地图