C/C++ 面试复习笔记(2)

C语言如何实现快速排序算法?

  • 答案:快排是一种分治算法,选择一个基准元素,将数据划分成两部分,然后递归排序

  • 补充:

void quick_sort(int arr[], int start, int end)
{//判断是否需要排序if (start >= end){return;}
​int left = start;int right = end;int pivot = arr[left];  //基准值while (left < right){//实现大于基准值的数字放到左边while ((arr[right] > pivot) && (left < right)){right--;}if (left < right){arr[left] = arr[right]; //将基准值填入left++;}//实现小于基准值的数字放到右while ((arr[left] < pivot) && (left < right)){left++;}if (left < right){arr[right] = arr[left]; //将基准值填入right--;}arr[left] = pivot;}//递归排序quick_sort(arr, start, left - 1);quick_sort(arr, right+1, end);
}

C语言中的setvbuf函数作用是什么?

  • 答案:setvbuf 用于设置文件流的缓冲区模式和大小,优化文件读写的性能。

  • 解析:setvbuf 可以设置缓冲区类型(如全缓冲、无缓冲、行缓冲),并定义缓冲区的大小, 适用于文件流的优化。

  • 补充:

缓冲区的类型

缓冲区分为三种类型:全缓冲、行缓冲和不缓冲。

1、全缓冲

在这种情况下,当填满标准I/O缓存后才进行实际I/O操作。全缓冲的典型代表是对磁盘文件的读写。

2、行缓冲

在这种情况下,当在输入和输出中遇到换行符时,执行真正的I/O操作。这时,我们输入的字符先存放在缓冲区,等按下回车键换行时才进行实际的I/O操作。典型代表是键盘输入数据。

3、不缓冲

也就是不进行缓冲,标准出错情况stderr是典型代表,这使得出错信息可以直接尽快地显示出来。

缓冲区的刷新

下列情况会引发缓冲区的刷新:

  1. 缓冲区满时;

  2. 执行fflush函数;

  3. 正常关闭文件。

  4. 正常退出程序或进程。

  5. 行缓冲遇到 \n刷新。

如何改变缓存类型

//与缓冲区相关的一些函数
#include <stdio.h>
void setbuf(FILE *stream, char *buf);
void setbuffer(FILE *stream, char *buf, size_t size);
void setlinebuf(FILE *stream);
​
​
int setvbuf(FILE *stream, char *buf, int mode , size_t size);
参数:
stream:这是指向 FILE 对象的指针,该 FILE 对象标识了一个打开的流。
buffer:这是分配给用户的缓冲。如果设置为 NULL,该函数会自动分配一个指定大小的缓冲。
mode: 这指定了文件缓冲的模式:_IOFBF、_IOLBF、_IONBF。
size:这是缓冲的大小,以字节为单位。
返回值:
如果成功,则该函数返回 0,否则返回非零值。

VScode中的stdout属于无缓冲类型

Ubuntu中的stdout属于行缓冲类型(行缓冲遇到换行符会清空缓冲区,而全缓冲不会)

解释C语言中的volatile关键字并给出应用场景。

  • 答案:volatile 告诉编译器,该变量的值可能随时被外部因素改变,因此禁止优化该变量的读取和写入。

  • 解析:volatile 常用于多线程或硬件寄存器操作等场景,确保每次读取变量时都从内存中获取最新值,避免编译器优化。

  • 补充:

  1. volatile 的作用

    • 禁止优化:编译器通常会对变量进行优化,以提高程序的运行效率。例如,如果某个变量在代码中多次赋值,但是值没有改变,编译器可能会认为这个变量不再被使用,从而优化掉一些访问该变量的代码。但是,当变量是 volatile 类型时,编译器不会做这种优化,确保每次访问变量时都进行实际的读取或写入操作。

    • 外部改变volatile 修饰的变量通常表示该变量的值可以在程序的执行过程中被外部因素(如硬件设备或其他线程)改变。

  2. 常见的应用场景

    • 硬件寄存器:在嵌入式系统编程中,硬件设备的寄存器可能会随时被硬件更改。为了保证对这些寄存器的访问不会被优化掉,通常会用 volatile 修饰寄存器变量。

    • 多线程编程:在多线程程序中,如果一个线程在修改某个变量,而其他线程正在读取该变量,使用 volatile 修饰该变量可以确保每个线程读取到变量的最新值。

如何判断一个链表是否有环?

bool has_cycle(struct ListNode *head) { struct ListNode *slow = head, *fast = head; while (fast && fast->next) { slow = slow->next; fast = fast->next->next; if (slow == fast) return true; } return false; 
} 

如何实现一个 LRU 缓存(Least Recently Used Cache)?

  • 答案:使用双向链表和哈希表结合来实现。哈希表提供快速的访问,双向链表维护访问顺序,当缓存满时,删除最久未使用的元素。

  • 解析:使用双向链表存储数据,哈希表存储键和节点的映射。每次访问数据时,将对应节点移到链表的头部。若缓存满了,删除链表尾部节点。

如何实现一个线程安全的计数器?

  • 答案:使用互斥锁(mutex) 或原子操作来确保多个线程同时访问时不会产生竞态条件。

  • 解析:使用pthread mutex_ t来加锁计数器的修改操作,确保线程安全。也可以使用原子操作(如atomic)来避免锁的开销。

pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER; 
int counter = 0; 
void increment() { pthread_mutex_lock(&lock); counter++; pthread_mutex_unlock(&lock); 
} 
  • 补充:

std::atomic 是 C++ 提供的一种用于多线程编程的同步原语,保证对数据类型的操作是原子的,即不会被中断或与其他线程产生冲突。它适用于需要在线程之间共享数据而不需要加锁的场景,提供比传统的锁(如 std::mutex)更好的性能。

常用场景 std::atomic 通常用于以下情况:

共享资源的安全访问:在多线程程序中,多个线程需要访问和修改同一变量。 避免锁机制的开销:锁会带来性能上的开销,而 std::atomic 提供了更轻量的原子操作。 简单的同步:当仅需要单个变量的同步时,使用 std::atomic 是非常高效的。

std::atomic 支持的类型 内置基础类型:如 int, bool, char, float, double 等。 自定义类型:可以将自定义结构体/类声明为 std::atomic<T>,但必须保证其满足 "trivially copyable"(平凡可拷贝)要求,即没有自定义构造、析构、拷贝构造和赋值运算符等。

#include <iostream>
#include <atomic>
#include <thread>
​
std::atomic<int> counter(0); // 初始化原子计数器
​
void increment() {for (int i = 0; i < 10000; ++i) {counter.fetch_add(1, std::memory_order_relaxed); // 原子增加}
}
​
int main() {std::thread t1(increment);std::thread t2(increment);
​t1.join();t2.join();
​std::cout << "Final counter value: " << counter << std::endl; // 输出最终的计数器值
​return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/web/81918.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2025吉林CCPC 题解(前六题)

// Problem: J - Odd-Even Game // Contest: Virtual Judge - sdccpc20250527 // URL: https://vjudge.net/contest/719585#problem/J // Memory Limit: 1024 MB // Time Limit: 1000 ms // 签到题 // Powered by CP Editor (https://cpeditor.org)#include <bits/std…

Q: dify知识库模块主要库表和字段

【回到目录】~~~~【回到问题集】 Q: dify知识库模块主要库表和字段 A: 表1&#xff1a;datasets 知识库表 name 知识库名称 index_struct 向量索引node 表2&#xff1a;document 文档表 name 文档名称 word_count 字数 doc_form 分段类型(hierarchical_model、qa_model、te…

NodeMediaEdge快速上手

NodeMediaEdge快速上手 简介 NodeMediaEdge是一款部署在监控摄像机网络前端中&#xff0c;拉取Onvif或者rtsp/rtmp/http视频流并使用rtmp/kmp推送到公网流媒体服务器的工具。 通过云平台协议注册到NodeMediaServer后&#xff0c;可以同NodeMediaServer结合使用。使用图形化的…

通用前端框架项目静态部署到Hugging Face Space的实践指南

背景介绍 在轻量级展示前端项目的场景中,Hugging Face Space 提供了一个便捷的静态托管平台。需求是将无后端服务的Vite的 Vue项目部署到Hugging Face Space 上。其实无论是基于Vite的Vue/React项目,还是使用Webpack构建的工程化方案,都可以通过两种方式将其部署到Space:自…

Android studio 查看aar源码出现/* compiled code */

如图查看aar源码时看不到具体实现&#xff0c;在排除是sdk版本导致的问题后&#xff0c;下面说解决方法 打开设置&#xff0c;找到插件 输入decompiler 搜索 这个是自带的反编译工具&#xff0c;启用就好了

Spark实时流数据处理实例(SparkStreaming通话记录消息处理)

所用资源&#xff1a; 通过网盘分享的文件&#xff1a;spark-streaming-kafka-0-8-assembly_2.11-2.4.8.jar等4个文件 链接: https://pan.baidu.com/s/1zYHu29tLgDvS_L2Ud-22ZA?pwdhnpg 提取码: hnpg 1.需求分析 &#xff1a; 假定有一个手机通信计费系统&#xff0c;用户通…

Vue3处理number输入框避免NaN

在 Vue3 中处理 number 类型输入框避免显示 NaN&#xff0c;核心在于正确处理用户输入的非数字值。以下是几种解决方案&#xff1a; 方案1&#xff1a;使用字符串中转 计算属性&#xff08;推荐&#xff09; vue 复制 下载 <template><input v-model"input…

Python自动化之selenium语句——浏览器设置显示尺寸、截图、刷新网页

目录 一、浏览器设置最大化、最小化 1.浏览器最大化 2.浏览器最小化 二、浏览器打开的位置、尺寸 1.浏览器打开位置 2.浏览器打开尺寸 三、浏览器截图 1.截图语句 2.运行成功后查看 四、刷新网页 上一节实现了打开浏览器、打开指定网址、关闭浏览器的操作&#xff0c…

model.classifier:分类头

model.classifier:分类头 分类头(model.classifier)含义 在基于Transformer架构的模型(如BERT、GPT等 )用于分类任务时,“分类头(model.classifier)” 是模型的一个重要组成部分。以Hugging Face的Transformers库为例,许多预训练模型在完成通用的预训练任务(如语言…

4.1.2 操作数据集

在本实战中&#xff0c;我们深入学习了Spark SQL的操作数据集&#xff0c;包括了解Spark会话、准备数据文件、启动Spark Shell以及获取和操作学生数据集。通过Spark Shell&#xff0c;我们可以直接使用SparkSession实例来加载、转换和处理数据。我们学习了如何将文本文件加载为…

LangChain整合Milvus向量数据库实战:数据新增与删除操作

导读&#xff1a;在AI应用开发中&#xff0c;向量数据库已成为处理大规模语义搜索和相似性匹配的核心组件。本文通过详实的代码示例&#xff0c;深入探讨LangChain框架与Milvus向量数据库的集成实践&#xff0c;为开发者提供生产级别的向量数据管理解决方案。 文章聚焦于向量数…

从根源解决Augment免费额度限制问题:Windows详细教程

从根源解决Augment免费额度限制问题&#xff1a;Windows详细教程 本文将详细介绍如何在Windows系统上解决Augment AI助手的"Too many free trials"限制问题&#xff0c;通过清理VS Code缓存和修改设备ID实现无限制使用Augment的方法。 视频地址 augment从根源上解决免…

IoTDB 集成 DBeaver,简易操作实现时序数据清晰管理

数据结构一目了然&#xff0c;跨库分析轻松实现&#xff0c;方便 IoTDB “内部构造”管理&#xff01; 随着物联网场景对时序数据处理需求激增&#xff0c;时序数据库与数据库管理工具的集成尤为关键。作为数据资产的 “智能管家”&#xff0c;借助数据库管理工具的可视化操作界…

应用层协议http(无代码版)

目录 认识URL urlencode 和 urldecode HTTP 协议请求与响应格式 HTTP 的请求方法 GET 方法 POST 方法 HTTP 的状态码 HTTP 常见 Header Location 关于 connection 报头 HTTP版本 远程连接服务器工具 setsockopt 我们来学习应用层协议http。 虽然我们说, 应用层协…

Cangjie 中的值类型与引用类型

1. 值类型和引用类型 1.1 值的存储方式 所有变量在底层实现中&#xff0c;都会关联一个具体的“值”&#xff0c;这个值可能存储在 内存地址 或 寄存器 中。 寄存器用于优化常用变量的访问速度。只有局部、小、频繁使用的变量才更可能被分配到寄存器中。实际行为由编译器根据…

使用el-input数字校验,输入汉字之后校验取消不掉

先说说复现方式 本来input是只能输入数字的&#xff0c;然后你不小心输入了汉字&#xff0c;触发校验了&#xff0c;然后这时候&#xff0c;你发现校验取消不掉了 就这样了 咋办啊&#xff0c;你一看校验没错啊&#xff0c;各种number啥的也写了,发现没问题啊 <el-inputv…

使用 Zabbix 监控 MySQL 存储空间和性能指标的完整实践指南

目录 引言 一、最终目标支持功能 二、监控方案设计 2.1 技术选型 2.2 设计思路 三、实现步骤 3.1 准备工作 3.11 创建 MySQL 监控账号 3.12 配置 .my.cnf 文件 3.2 编写统一脚本 3.3 配置 Zabbix Agent UserParameter 3.4 Zabbix 前端配置建议 四、总结 引言 MySQL …

多元素纳米颗粒:开启能源催化新纪元

在能源转型的浪潮中&#xff0c;纳米催化剂正成为推动能源技术突破的关键力量。多元素纳米颗粒&#xff08;Polyelemental Nanoparticles&#xff09;凭借其独特的元素协同效应&#xff0c;展现出在能源催化领域的巨大潜力。然而&#xff0c;合成这些复杂体系的纳米颗粒面临着诸…

铁路行业数字化应用建设方案

数字化转型面临的挑战 铁路行业正处于数字化转型的关键时期&#xff0c;铁路行业应用场景复杂&#xff0c;数据量巨大&#xff0c;传统信息化建设模式难以满足日益增长的业务需求。铁路企业亟需引入敏捷高效的数字化工具&#xff0c;加速推进业务创新&#xff0c;实现提质增效…

PlankAssembly 笔记 DeepWiki 正交视图三维重建

manycore-research/PlankAssembly | DeepWiki PlankAssembly项目原理 这个项目是一个基于深度学习的3D重建系统&#xff0c;其核心原理是从三个正交视图的工程图纸中重建出3D形状的结构化程序表示。 核心技术原理 1. 问题定义 PlankAssembly旨在从三个正交视图的工程图纸中…