C++高频知识点(十七)
文章目录
- 81. 你对智能指针的了解
- 82. 一元、二元仿函数的区别和使用背景
- 一元仿函数
- 二元仿函数
- 83. 描述Linux下文件删除的原理
- 84. 什么是菱形继承?有什么问题,怎么解决?
- 解决菱形继承问题
- 85. IO多路复用是什么?
- select
- poll
- epoll
- select 图示
- epoll 图示
- epoll 优越的数据结构(红黑树+双向链表)
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;否则返回 falsereturn 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 的一些问题。
之后我会持续更新,如果喜欢我的文章,请记得一键三连哦,点赞关注收藏,你的每一个赞每一份关注每一次收藏都将是我前进路上的无限动力 !!!↖(▔▽▔)↗感谢支持!