C++高频知识点(十七)

发布于:2025-08-11 ⋅ 阅读:(10) ⋅ 点赞:(0)

81. 你对智能指针的了解

在这里插入图片描述

82. 一元、二元仿函数的区别和使用背景

一元仿函数

在这里插入图片描述

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

// 一元谓词:判断整数是否为偶数
class IsEven {
public:
    bool operator()(int x) const {
        return x % 2 == 0;
    }
};

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

    // 使用find_if和一元谓词查出第一个偶数
    // std::find_if 是 C++ 标准库中的一个算法,用来在容器(比如 std::vector)中查找第一个符合给定条件的元素。
    // template< class InputIterator, class UnaryPredicate >
    // InputIterator find_if( InputIterator first, InputIterator last, UnaryPredicate pred );
    /*
    InputIterator first:容器的起始迭代器。对于 std::vector,这通常是 vec.begin(),即指向容器第一个元素的迭代器。
    InputIterator last:容器的结束迭代器。对于 std::vector,这通常是 vec.end(),即指向容器最后一个元素后面的位置。
    UnaryPredicate pred:一个 一元谓词(返回 bool 的函数或函数对象),它定义了要查找的条件
    */
    auto it = std::find_if(vec.begin(), vec.end(), IsEven());
    if (it != vec.end()) {
        std::cout << "The first even number is: " << *it << std::endl;
    } else {
        std::cout << "No even number found." << std::endl;
    }

    return 0;
}

在这里插入图片描述

二元仿函数

在这里插入图片描述

#include <iostream>
#include <vector>
#include <algorithm>
#include <functional> // 包含std::abs

// 定义一个比较函数,用于比较两个整数的绝对值
struct AbsCompare {
    bool operator()(int a, int b) const {
        // 如果 a 的绝对值小于 b 的绝对值,返回 true;否则返回 false
        return std::abs(a) < std::abs(b);
    }
};

int main() {
    std::vector<int> vec = {3, -5, 2, -1, 4};
    std::sort(vec.begin(), vec.end(), AbsCompare()); // 使用三元函数进行排序

    for (int num : vec) {
        std::cout << num << ' ';
    }
    std::cout << std::endl;

    return 0;
}

在这里插入图片描述

83. 描述Linux下文件删除的原理

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

84. 什么是菱形继承?有什么问题,怎么解决?

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

解决菱形继承问题

C++ 通过 虚拟继承(Virtual Inheritance)来解决菱形继承问题。虚拟继承使得通过多个路径继承自同一个基类时,基类只会有一份副本。

在这里插入图片描述

#include <iostream>

class A {
public:
    int x;
    A() : x(10) {}
    void print() { std::cout << "A: " << x << std::endl; }
};

class B : virtual public A { 
public:
    B() { x = 20; } 
};

class C : virtual public A { 
public:
    C() { x = 30; } 
};

class D : public B, public C { 
public:
    void show() { std::cout << "D: " << x << std::endl; }
};

int main() {
    D d;
    d.show();
    return 0;
}

在这里插入图片描述
在这里插入图片描述

85. IO多路复用是什么?

IO多路复用(I/O Multiplexing)是指在单个线程或进程中同时管理多个输入/输出操作的能力,通常用于处理多个客户端连接,避免为每个连接创建一个线程或进程。常见的 IO多路复用 系统调用有 select、poll 和 epoll。它们的作用都是监视多个文件描述符,并在其中的某个文件描述符准备好进行操作时,通知应用程序。

select

select 是最早实现的 I/O 多路复用机制,在 UNIX 和 Linux 系统中都广泛存在

int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);

在这里插入图片描述

poll

在这里插入图片描述
在这里插入图片描述

epoll

在这里插入图片描述

在这里插入图片描述

select 图示

在这里插入图片描述
在这里插入图片描述

epoll 图示

在这里插入图片描述

epoll 优越的数据结构(红黑树+双向链表)

epoll 的优越性主要来自其 高效的数据结构设计,特别是 红黑树 和 双向链表 的组合。它们使得 epoll 在性能和扩展性上相比于传统的 select 和 poll 更加优秀。接下来,我们将详细讨论这些数据结构如何帮助 epoll 提高性能,并解决了 select 和 poll 的一些问题。

在这里插入图片描述

之后我会持续更新,如果喜欢我的文章,请记得一键三连哦,点赞关注收藏,你的每一个赞每一份关注每一次收藏都将是我前进路上的无限动力 !!!↖(▔▽▔)↗感谢支持!


网站公告

今日签到

点亮在社区的每一天
去签到