CPP自定义排序--针对智能指针

Posted 霍格沃兹在逃麻瓜

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CPP自定义排序--针对智能指针相关的知识,希望对你有一定的参考价值。

目录

代码块

#include <iostream>
#include <memory>
#include <vector>
#include <algorithm>

using namespace std;

class Base

public:
    virtual void Print()  std::cout << "I am Base!\\n"; 
;

class Derived1: public Base

public:
    void Print() override  std::cout << "I am Derived1!\\n";;
;

class Derived2: public Derived1

public:
    void Print() override  std::cout << "I am Derived2!\\n";;
;

using SpBase = std::shared_ptr<Base>;
using VecSpBase = std::vector<std::shared_ptr<Base>>;

bool Cmp(const SpBase& a, const SpBase& b)

    auto SwitchOrder = [](const SpBase& elem) -> int 
        if (dynamic_cast<Derived2*>(elem.get())) 
            return 1;
         else if (dynamic_cast<Derived1*>(elem.get())) 
            return 2;
         else 
            return 3;
        
    ;
    return SwitchOrder(a) < SwitchOrder(b);


int main()

    SpBase base1 = make_shared<Base>();
    SpBase base2 = make_shared<Base>();
    SpBase derived11 = make_shared<Derived1>();
    SpBase derived12 = make_shared<Derived1>();
    SpBase derived21 = make_shared<Derived2>();
    SpBase derived22 = make_shared<Derived2>();
    VecSpBase vec = base1, base2, derived11, derived12, derived21, derived22;
    auto Print = [&vec](std::string_view const rem)
    
        cout << rem << endl;
        for (auto item : vec) 
            cout << item.get() << ",";
        
        printf("\\n");
    ;
    Print("before:");
    std::sort(vec.begin(), vec.end(), Cmp);
    Print("after");

C 语言二级指针作为输入 ( 自定义二级指针内存 | 二级指针排序 | 通过 交换指针指向的内存数据 方式进行排序 )





一、二维指针 排序 ( 通过 交换指针指向的内存数据 方式进行排序 )



在上一篇博客 【C 语言】二级指针作为输入 ( 二维指针 | 为 二维指针 分配内存 - 存放 一维指针 | 为每个 一维指针 分配内存 | 释放二维指针内存 ) 基础上 , 对 二维指针 指向的 若干 一维指针 指向的数据 进行排序 ;


首先 , 准备好了循环控制变量 , 和 排序 交换 时 , 使用的 中间变量 ;

  • 循环控制变量 : 排序一般需要定义两个变量 ;
    // 循环控制变量
    int i = 0, j = 0;
  • 排序时 , 交换指针指向的内存数据 , 该数组是存储 要 交换内存数据 的临时变量 ;
    // 排序时 , 交换指针指向的内存数据
    // 该数组是存储 要 交换内存数据 的临时变量
    char tmp[30];

然后 , 对二维指针指向的数据 , 进行排序 ; 涉及到使用 strcmp 函数 , 参考 【C 语言】二级指针作为输入 ( 指针数组 | 指针数组排序 | 字符串排序 | strcmp 函数 ) 一、strcmp 函数 博客章节 , 进行理解 ;

    // 对 二维指针 指向的数据进行排序
    for(i = 0; i < num; i++)
    
        for(j = i + 1; j < num; j++)
        
            // 交换 i , j 指针指向的内存数据
            // 从 大 到 小 进行排序
            if(strcmp(p[i], p[j]) < 0)
            
                strcpy(tmp, p[i]);
                strcpy(p[i], p[j]);
                strcpy(p[j], tmp);
            
        
    




二、完整代码示例



完整代码示例 :

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()

    // 二维指针 指向的 一维指针 个数
    int num = 4;

    // 声明二维指针
    char **p = NULL;

    // 循环控制变量
    int i = 0, j = 0;

    // 排序时 , 交换指针 , 该指针是存储 要 交换指针 的临时变量
    //char *tmp = NULL;

    // 排序时 , 交换指针指向的内存数据
    // 该数组是存储 要 交换内存数据 的临时变量
    char tmp[30];

    // 在堆内存中 , 分配一块内存空间
    // 用于存储 num 个 一维指针
    // 每个 一维指针 指向一块内存空间
    p = (char **)malloc( sizeof(char*) * num );

    // 遍历 二维指针 指向的多个 一维指针
    // 并为每个 一维指针 在堆内存中 分配 20 字节内存
    for(i = 0; i < num; i++)
    
        // 为每个字符分配 20 字节空间
        p[i] = (char *)malloc(sizeof (char) * 20);
        // 向内存中写入 字符串 , 字符串内容是 i + 1
        // 注意是通过通配符拼装的字符串
        sprintf(p[i], "%d", i + 1);
    

    // 打印字 二维指针 指向的 num 个 一维数组 指向的 字符串
    for(i = 0; i < num; i++)
    
        printf("%s\\n", p[i]);
    

    // 对 二维指针 指向的数据进行排序
    for(i = 0; i < num; i++)
    
        for(j = i + 1; j < num; j++)
        
            // 交换 i , j 指针指向的内存数据
            // 从 大 到 小 进行排序
            if(strcmp(p[i], p[j]) < 0)
            
                strcpy(tmp, p[i]);
                strcpy(p[i], p[j]);
                strcpy(p[j], tmp);
            
        
    

    // 打印字 二维指针 指向的 num 个 一维数组 指向的 字符串
    printf("\\nSort : \\n");
    for(i = 0; i < num; i++)
    
        printf("%s\\n", p[i]);
    


    // 释放内存
    // 先释放 num 个 一级指针
    for(i = 0; i < num; i++)
    
        if(p[i] != NULL)
        
            free(p[i]);
            p[i] = NULL;
        
    

    // 再释放 二级指针
    if(p != NULL)
    
        free(p);
    

    // 命令行不要退出
    system("pause");
    return 0;


执行结果 :

以上是关于CPP自定义排序--针对智能指针的主要内容,如果未能解决你的问题,请参考以下文章

Qt之模型/视图(自定义按钮)

C++ 自定义智能指针

如何使用自定义迭代器循环通过智能指针指向类

Visual Studio中智能指针对象的自定义视图?

C 语言二级指针作为输入 ( 自定义二级指针内存 | 二级指针 排序 | 通过 交换指针方式 进行排序 )

c_cpp C ++自定义排序对由asc,desc