首页 > 编程语言 >C++学习笔记

C++学习笔记

时间:2024-07-22 21:54:21浏览次数:12  
标签:sort last 迭代 笔记 学习 RandomAccessIterator C++ 排序 first

-------------------------------------------------------------------

给一个无单向不循环链表的首结点l,编写程序反转链表,并返回反转后的链表首结点

struct llist_node {
    int val;
    struct llist_node *next;
};

struct llist_node *func(struct llist_node *l)
{
    struct llist_node *cur = l;
    struct llist_node *prev = NULL;    // 指向链表当前节点的上一个节点
    struct llist_node *next = NULL;    // 指向链表当前节点的下一个节点

    while (cur) {
        next = cur->next;
        cur->next = prev;
        prev = cur;
        cur = next;
    }

    return cur;
}

-------------------------------------------------------------------

二、STL模板库----算法(algorithm)

                我们所有的算法都是在algorithm头文件中声明,所以在使用前需要包含头文件

#include<algorithm>

        1、排序

                1)sort()(基于快排实现)
/*
        sort --- 对[first,last)范围内的成员进行排序(默认升序排序)
        first :一种随机访问迭代器,用于指定要排序范围的起始成员
        last  :一种随机访问迭代器,用于指定要排序范围的最后一个成员的下一个位置
*/
template <class RandomAccessIterator>  
void sort (RandomAccessIterator first, RandomAccessIterator last);

/*
        sort --- 对[first,last)范围内的成员进行排序(默认升序排序)
        first :一种随机访问迭代器,用于指定要排序范围的起始成员
        last  :一种随机访问迭代器,用于指定要排序范围的最后一个成员的下一个位置
        comp  :调用者自己定义的排序方法
*/
template <class RandomAccessIterator, class Compare>  
void sort (RandomAccessIterator first, RandomAccessIterator last, Compare comp);

/*

        ps:

        时间复杂度为:O(N*log2(N)),N为first与last之间的距离

        1、容器支持的迭代器类型必须是随机访问迭代器,这意味着,sort()只对array、vector、deque这3个容器提供支持。

        2、如果对容器中指定范围的成员做默认升序排序,必须保证该成员类型支持<运算符的运算。

        3、sort()函数在实现排序时,需要交换容器中元素的存储位置,这种情况下,如果容器中存储的是自定义的类对象,则该类内部必须提供移动构造函数和移动赋值运算符。

*/

                2)stable_sort(基于归并实现)
/*
        stable_sort--- 对[first,last)范围内的成员进行排序(默认升序排序)
        first :一种随机访问迭代器,用于指定要排序范围的起始成员
        last  :一种随机访问迭代器,用于指定要排序范围的最后一个成员的下一个位置
*/
template <class RandomAccessIterator>  
void stable_sort(RandomAccessIterator first, RandomAccessIterator last);

/*
        stable_sort--- 对[first,last)范围内的成员进行排序(默认升序排序)
        first :一种随机访问迭代器,用于指定要排序范围的起始成员
        last  :一种随机访问迭代器,用于指定要排序范围的最后一个成员的下一个位置
        comp  :调用者自己定义的排序方法
*/
template <class RandomAccessIterator, class Compare>  
void stable_sort(RandomAccessIterator first, RandomAccessIterator last, Compare comp);

/*

        ps:

        空间足够:时间复杂度为:O(N*log2(N)),N为first与last之间的距离

        空间不足:时间复杂度为:O(N*log2(N)2),N为first与last之间的距离

        1、同sort()函数

        2、可以保证不改变相等元素的相对位置。

*/                 

                3)partial_sort(基于交换元素存储位置实现)
/*
        partial_sort--- 对[first,last)范围内的数据进行筛选并排序(默认升序排序)
        first  :一种随机访问迭代器,用于指定要排序范围的起始成员
        middle :一种随机访问迭代器,用于指定要排序的子范围的最后一个成员的下一个位置
        last   :一种随机访问迭代器,用于指定要排序范围的最后一个成员的下一个位置
*/
template <class RandomAccessIterator>  
void partial_sort (RandomAccessIterator first, 
                   RandomAccessIterator middle,                     
                   RandomAccessIterator last);
/*
        partial_sort--- 对[first,last)范围内的数据进行筛选并排序(默认升序排序)         first  :一种随机访问迭代器,用于指定要排序范围的起始成员
        middle :一种随机访问迭代器,用于指定要排序的子范围的最后一个成员的下一个位置         last   :一种随机访问迭代器,用于指定要排序范围的最后一个成员的下一个位置
        comp   :调用者自己定义的排序方法
*/
template <class RandomAccessIterator, class Compare> 
void partial_sort (RandomAccessIterator first, 
                   RandomAccessIterator middle, 
                   RandomAccessIterator last, 
                   Compare comp);

/*

        ps:

        时间复杂度为:N*log(M)

        其中 N 指的是 [first, last) 范围的长度,M 指的是 [first, middle) 范围的长度。

        1、同sort()函数

        2、partial_sort() 会将 [first, last) 范围内最小(或最大)的 middle-first 个元素移动到 [first, middle) 区域中,并对这部分元素做升序(或降序)排序。剩余的元素不一定保持原来相对顺序。

*/

        2、查找         

                1)find(基于==运算符)
/*
        find --- 在[first,last)范围内找到和目标元素值相等的第一个元素
        first :一种输入迭代器,用于指定要排序范围的起始成员
        last  :一种输入迭代器,用于指定要排序范围的最后一个成员的下一个位置
        val   : 要查找的值
        return : successed ---  返回一个输入迭代器,指向查找到的第一个元素
                  failed    ---  返回一个输入迭代器,与last指向相同
*/
template <class InputIterator, class T>   
InputIterator find (InputIterator first, InputIterator last, const T& val);

/*底层实现*/

template<class InputIterator, class T>
InputIterator find (InputIterator first, InputIterator last, const T& val)
{
    while (first!=last) {
        if (*first==val) return first;
        ++first;
    }
    return last;
}

/*        

        ps:

        1、使用find()函数时,必须保证查找的元素支持==运算符

*/

                 2)find_if(基于==运算符)
/*
        find_if --- 在[first,last)范围内找到第一个符合查找规则(返回true)的元素
        first :一种输入迭代器,用于指定要排序范围的起始成员
        last  :一种输入迭代器,用于指定要排序范围的最后一个成员的下一个位置
        pred  : 用户自定义的查找规则
        return &

标签:sort,last,迭代,笔记,学习,RandomAccessIterator,C++,排序,first
From: https://blog.csdn.net/qq_45882170/article/details/140573731

相关文章

  • c++(4) sophus可视化和计算误差
             CMakeLists.txtproject(test)find_package(PangolinREQUIRED)include_directories(${Pangolin_INCLUDE_DIRS})find_package(fmtREQUIRED)set(FMT_LIBRARIESfmt::fmt)#set(v1_node_filemain.cpp)add_executable(v1_nodemain.cpp)......
  • 【c++经典面试题】有关string类的深浅拷贝
    题目背景基于自实现string类substr成员函数时遇到的问题。代码展示stringstring::substr(size_tpos,size_tlen)//声明时len的参省值位npos { assert(pos<_size); if(len>_size-pos)//如果len的长度大于有效字符长度,那么重置为有效字符长度 { le......
  • Java基础-学习笔记06
    **06访问修饰符封装继承多态**访问修饰符public公开级别,对外公开protected受保护级别,对子类和同一个包中的类公开default默认级别,无修饰符,向同一个包的类公开private私有级别,只有类本身可以访问,不对外公开修饰符可以用来修饰类中的属性,成员方法以及类只有默认......
  • 《昇思25天学习打卡营第24天|生成式-Pix2Pix实现图像转换》
    Pix2Pix实现图像转换Pix2Pix概述Pix2Pix是基于条件生成对抗网络(cGAN,ConditionGenerativeAdversarialNetworks)实现的一种深度学习图像转换模型该网络学习从输入图像到输出图像的映射,如Isola等人在Image-to-imagetranslationwithconditionaladversarialnetwor......
  • c++(0) sophus矩阵转换
     1安装sophus2使用代码2-1R,t矩阵q四元数转换so3和se3 CMakeLists.txtcmake_minimum_required(VERSION3.0)project(useSophus)#为使用sophus,需要使用find_package命令找到它find_package(SophusREQUIRED)#Eigeninclude_directories("/usr/include/eigen3"......
  • Pandas 和numpy 入门详细笔记
    1.安装和导入1.1安装pipinstallpandaspipinstallnumpy1.2导入importpandasaspdimportnumpyasnp2.数据结构2.1Series(系列)定义:一维标签化数组,可以保存任何数据类型(整数、浮点数、字符串等)。创建Series:#从列表创建s=pd.Series([10,20,30,40]......
  • MPLS-EVPN笔记详述
    目录EVPN简介:EVPN路由:基本四种EVPN路由扩展:EVPN工作流程:1.启动阶段:2.流量转发:路由次序整理:总结:EVPN基本术语:EVPN表项:EVPN支持的多种服务模式:简介:1.PortBased:简介:配置实现:2.VLANBased:简介:配置实现:3.VLANBundle:简介:配置实现:VLAN-AwareBundle:简介:M......
  • OI-Wiki 学习笔记
    算法基础\(\text{Update:2024-07-22}\)复杂度定义衡量一个算法的快慢,一定要考虑数据规模的大小。一般来说,数据规模越大,算法的用时就越长。而在算法竞赛中,我们衡量一个算法的效率时,最重要的不是看它在某个数据规模下的用时,而是看它的用时随数据规模而增长的趋势,即时间复......
  • 高速收发器:PHY层笔记(一)
    笔记:高速收发器的数据位宽通常有:2,4,8字节等;PCIE喜欢的位宽是1DW=4Byte;这里对高速收发器的设计为4Byte也就是32位宽;GT中PHY层的字对齐和掩码处理高速收发器的数据流以SOT开始(和MIPI一样),GT的SOT一般就是K码,标志了开始,其也具有EOT,标志了结束;但与MIPI有很大的不同,GT的K码可......
  • 《0基础》学习Python——第二十四讲__爬虫/<7>深度爬取
    一、深度爬取        深度爬取是指在网络爬虫中,获取网页上的所有链接并递归地访问这些链接,以获取更深层次的页面数据。        通常,一个简单的爬虫只会获取到初始页面上的链接,并不会进一步访问这些链接上的其他页面。而深度爬取则会不断地获取链接,并继续访问......