做视频网站 带宽计算/seo就业
C++面试常考手写题目
- vector
- string
- auto_ptr
- shared_ptr
- unique_ptr
- weak_ptr
- singleton
- 快排非递归
- heap
- heap_sort
- merge_sort
vector
#include <bits/stdc++.h>
using namespace std;template<typename T>
class vector {public:typedef T value_type;typedef T* iterator;private:value_type* _data;size_t _size;size_t _capacity;public:vector(): _data(NULL), _size(0), _capacity(0) {}~vector() {delete [] _data;_data = NULL;_size = 0;_capacity = 0;}vector(const vector& vec) {_size = vec._size;_capacity = vec._capacity;_data = new value_type[_capacity];for (int i = 0; i < _size; ++i) {_data[i] = vec._data[i];}}vector& operator=(const vector& vec) {if (this == &vec) return *this;value_type* temp = new value_type[vec._capacity];for (int i = 0; i < vec._size; ++i) {temp[i] = vec._data[i];}delete [] _data;_data = temp;_size = vec._size;_capacity = vec._capacity;return *this;}void push_back(value_type val) {if (0 == _capacity) {_capacity = 1;_data = new value_type[1];} else if (_size + 1 > _capacity) {_capacity *= 2;value_type* temp = new value_type[_capacity];for (int i = 0; i < _size; ++i) {temp[i] = _data[i];}delete [] _data;_data = temp;}_data[_size] = val;++_size;}void pop_back() {--_size;}size_t size() const {return _size;}size_t capacity() const {return _capacity;}bool empty() {return _size == 0;}value_type& operator[](size_t index) {return _data[index];}bool operator==(const vector& vec)const {if (_size != vec._size) return false;for (int i = 0; i < _size; ++i) {if (_data[i] != vec._data[i]) return false;}return true;}value_type front()const {return _data[0];}value_type back() const {return _data[_size - 1];}void insert(iterator it, value_type val) {int index = it - _data;if (0 == _capacity) {_capacity = 1;_data = new value_type[1];_data[0] = val;} else if (_size + 1 > _capacity) {_capacity *= 2;value_type* temp = new value_type[_capacity];for (int i = 0; i < index; ++i) {temp[i] = _data[i];}temp[index] = val;for (int i = index; i < _size; ++i) {temp[i + 1] = _data[i];}delete [] _data;_data = temp;} else {for (int i = _size - 1; i >= index; --i) {_data[i + 1] = _data[i];}_data[index] = val;}++_size;}void erase(iterator it) {size_t index = it - _data;for (int i = index; i < _size - 1; ++i) {_data[i] = _data[i + 1];}--_size;}iterator begin() {return _data;}iterator end() {return _data + _size;}
};
string
#include <iostream>
#include <cstring>class MyString {
public:// 构造函数MyString() {data_ = new char[1];data_[0] = '\0';size_ = 0;}MyString(const char* str) {size_ = strlen(str);data_ = new char[size_ + 1];strcpy(data_, str);}// 拷贝构造函数MyString(const MyString& other) {size_ = other.size_;data_ = new char[size_ + 1];strcpy(data_, other.data_);}// 析构函数~MyString() {delete[] data_;}// 赋值运算符MyString& operator=(const MyString& other) {if (this == &other) {return *this;}delete[] data_;size_ = other.size_;data_ = new char[size_ + 1];strcpy(data_, other.data_);return *this;}// 大小size_t size() const {return size_;}// 清空void clear() {delete[] data_;data_ = new char[1];data_[0] = '\0';size_ = 0;}// 字符串内容的访问const char* c_str() const {return data_;}private:char* data_;size_t size_;
};
auto_ptr
#include <bits/stdc++.h>
using namespace std;template<class T>
class auto_ptr {public:auto_ptr(T* ptr = nullptr) : _ptr(ptr) {}~auto_ptr() {if (_ptr != nullptr) {cout << "delete: " << _ptr << endl;delete _ptr;_ptr = nullptr;}}auto_ptr(auto_ptr<T>& ap): _ptr(ap._ptr) {ap._ptr = nullptr; // 管理权转移后ap被置空}auto_ptr& operator=(auto_ptr<T>& ap) {if (this != &ap) {delete _ptr; // 释放自己管理的资源_ptr = ap._ptr; // 接管ap对象的资源ap._ptr = nullptr; // 管理权转移后ap被置空}return *this;}// 可以像指针一样使用T& operator*() {return *_ptr;}T* operator->() {return _ptr;}private:T* _ptr; //管理的资源
};
shared_ptr
#include <bits/stdc++.h>
using namespace std;template<class T>
class shared_ptr {public:shared_ptr(T* ptr = nullptr): _ptr(ptr), _pcount(new int(1)){}shared_ptr(shared_ptr<T>& sp): _ptr(sp._ptr), _pcount(sp._pcount) {(*_pcount)++;}~shared_ptr() {if (--(*_pcount) == 0) {if (_ptr != nullptr) {cout << "delete: " << _ptr << endl;delete _ptr;_ptr = nullptr;}delete _pcount;_pcount = nullptr;}}shared_ptr& operator=(shared_ptr<T>& sp) {if (_ptr != sp._ptr) { // 管理同一块空间的对象之间无需进行赋值操作if (--(*_pcount) == 0) { // 将管理的资源对应的引用计数--cout << "delete: " << _ptr << endl;delete _ptr;delete _pcount;}_ptr = sp._ptr; // 与sp对象一同管理它的资源_pcount = sp._pcount; // 获取sp对象管理的资源对应的引用计数(*_pcount)++; // 新增一个对象来管理该资源 引用计数++}return *this;}// 获取引用计数int use_count() {return *_pcount;}// 可以像指针一样使用T& operator*() {return *_ptr;}T* operator->() {return _ptr;}private:T* _ptr; // 管理的资源int* _pcount; // 管理的资源对应的引用计数 堆上
};template<class T>
class shared_ptr_with_mutex {private:// ++引用计数void AddRef() {_pmutex->lock();(*_pcount)++;_pmutex->unlock();}// --引用计数void ReleaseRef() {_pmutex->lock();bool flag = false;if (--(*_pcount) == 0) { // 将管理的资源对应的引用计数--if (_ptr != nullptr) {cout << "delete: " << _ptr << endl;delete _ptr;_ptr = nullptr;}delete _pcount;_pcount = nullptr;flag = true;}_pmutex->unlock();if (flag == true) {delete _pmutex;}}public:shared_ptr_with_mutex(T* ptr = nullptr): _ptr(ptr), _pcount(new int(1)), _pmutex(new mutex){}shared_ptr_with_mutex(shared_ptr_with_mutex<T>& sp): _ptr(sp._ptr), _pcount(sp._pcount), _pmutex(sp._pmutex) {AddRef();}~shared_ptr_with_mutex() {ReleaseRef();}shared_ptr_with_mutex& operator=(shared_ptr_with_mutex<T>& sp) {if (_ptr != sp._ptr) { // 管理同一块空间的对象之间无需进行赋值操作ReleaseRef(); // 将管理的资源对应的引用计数--_ptr = sp._ptr; // 与sp对象一同管理它的资源_pcount = sp._pcount; // 获取sp对象管理的资源对应的引用计数_pmutex = sp._pmutex; // 获取sp对象管理的资源对应的互斥锁AddRef(); // 新增一个对象来管理该资源,引用计数++}return *this;}// 获取引用计数int use_count() {return *_pcount;}// 可以像指针一样使用T& operator*() {return *_ptr;}T* operator->() {return _ptr;}private:T* _ptr; // 管理的资源int* _pcount; // 管理的资源对应的引用计数mutex* _pmutex; // 管理的资源对应的互斥锁
};
unique_ptr
#include <bits/stdc++.h>
using namespace std;template<class T>
class unique_ptr {public:unique_ptr(T* ptr = nullptr): _ptr(ptr){}~unique_ptr() {if (_ptr != nullptr) {cout << "delete: " << _ptr << endl;delete _ptr;_ptr = nullptr;}}// 可以像指针一样使用T& operator*() {return *_ptr;}T* operator->() {return _ptr;}// 防拷贝unique_ptr(unique_ptr<T>& up) = delete;unique_ptr& operator=(unique_ptr<T>& up) = delete;private:T* _ptr; // 管理的资源
};
weak_ptr
#include <bits/stdc++.h>
using namespace std;template<class T>
class weak_ptr {public:weak_ptr(): _ptr(nullptr){}weak_ptr(const shared_ptr<T>& sp): _ptr(sp.get()){}weak_ptr& operator=(const shared_ptr<T>& sp) {_ptr = sp.get();return *this;}// 可以像指针一样使用T& operator*() {return *_ptr;}T* operator->() {return _ptr;}private:T* _ptr; // 管理的资源
};
singleton
#include <iostream>
#include <mutex>class Singleton {
private:static Singleton* instance;static std::mutex mtx;Singleton() {} // 私有构造函数,防止外部实例化public:static Singleton* getInstance() {if (instance == nullptr) {std::lock_guard<std::mutex> lock(mtx); // 加锁if (instance == nullptr) {instance = new Singleton();}}return instance;}void showMessage() {std::cout << "Hello, I am a singleton instance!" << std::endl;}
};Singleton* Singleton::instance = nullptr;
std::mutex Singleton::mtx;int main() {Singleton* singleton1 = Singleton::getInstance();singleton1->showMessage();Singleton* singleton2 = Singleton::getInstance();singleton2->showMessage();return 0;
}
快排非递归
#include <bits/stdc++.h>
using namespace std;用一个栈(std::stack)将以下用递归实现的快排函数改成非递归// usage://std::vector<int> v = {3, 2, 1, 5, 6, 9, -1, -2, 0};//QuickSort(&v[0], 0, int(v.size())-1);void QuickSort(int *array, int low, int high){int i = low;int j = high;int pivot = array[(i + j) / 2];while (i <= j){while (array[i] < pivot)++i;while (array[j] > pivot)--j;if (i <= j){std::swap(array[i], array[j]);++i;--j;}}if (j > low)QuickSort(array, low, j);if (i < high)QuickSort(array, i, high);}void QuickSort(int* array, int low, int high) {stack<pair<int, int>> mystack;mystack.push(make_pair(low, high));while (!mystack.empty()) {int _low = mystack.top().first;int _high = mystack.top().second;int i = _low;int j = _high;mystack.pop();int pivot = array[(i + j) / 2];while (i <= j) {while (array[i] < pivot)++i;while (array[j] > pivot)--j;if (i <= j) {std::swap(array[i], array[j]);++i;--j;}}if (j > _low)mystack.push(make_pair(_low, j));if (i < _high)mystack.push(make_pair(i, _high));}
}
void display(vector<int>& a) {for (int& e : a) {cout << e << " ";}cout << endl;
}
heap
#include <iostream>
#include <vector>// 最小堆
class MinHeap {
public:MinHeap() {}void insert(int value) {heap.push_back(value);heapifyUp(heap.size() - 1);}int pop() {if (heap.empty()) {throw std::out_of_range("Heap is empty");}int minValue = heap[0];heap[0] = heap.back();heap.pop_back();heapifyDown(0);return minValue;}bool isEmpty() const {return heap.empty();}private:std::vector<int> heap;void heapifyUp(int index) {int parent = (index - 1) / 2;while (index > 0 && heap[index] < heap[parent]) {std::swap(heap[index], heap[parent]);index = parent;parent = (index - 1) / 2;}}void heapifyDown(int index) {int leftChild = 2 * index + 1;int rightChild = 2 * index + 2;int smallest = index;if (leftChild < heap.size() && heap[leftChild] < heap[smallest]) {smallest = leftChild;}if (rightChild < heap.size() && heap[rightChild] < heap[smallest]) {smallest = rightChild;}if (smallest != index) {std::swap(heap[index], heap[smallest]);heapifyDown(smallest);}}
};int main() {MinHeap heap;heap.insert(10);heap.insert(5);heap.insert(15);heap.insert(20);heap.insert(3);while (!heap.isEmpty()) {std::cout << heap.pop() << " ";}std::cout << std::endl;return 0;
}
heap_sort
#include <iostream>
#include <vector>void heapify(std::vector<int>& arr, int n, int i) {int largest = i;int left = 2 * i + 1;int right = 2 * i + 2;if (left < n && arr[left] > arr[largest]) {largest = left;}if (right < n && arr[right] > arr[largest]) {largest = right;}if (largest != i) {std::swap(arr[i], arr[largest]);heapify(arr, n, largest);}
}void heapSort(std::vector<int>& arr) {int n = arr.size();// 构建最大堆for (int i = n / 2 - 1; i >= 0; i--) {heapify(arr, n, i);}// 逐个提取最大元素并调整堆for (int i = n - 1; i > 0; i--) {std::swap(arr[0], arr[i]);heapify(arr, i, 0);}
}int main() {std::vector<int> arr = {9, 4, 7, 2, 1, 5, 8, 3, 6};heapSort(arr);std::cout << "排序结果: ";for (int num : arr) {std::cout << num << " ";}std::cout << std::endl;return 0;
}
merge_sort
#include <iostream>
#include <vector>// 合并两个有序数组
void merge(std::vector<int>& arr, int left, int mid, int right) {int n1 = mid - left + 1;int n2 = right - mid;std::vector<int> leftArr(n1);std::vector<int> rightArr(n2);for (int i = 0; i < n1; i++) {leftArr[i] = arr[left + i];}for (int j = 0; j < n2; j++) {rightArr[j] = arr[mid + 1 + j];}int i = 0, j = 0, k = left;while (i < n1 && j < n2) {if (leftArr[i] <= rightArr[j]) {arr[k] = leftArr[i];i++;} else {arr[k] = rightArr[j];j++;}k++;}while (i < n1) {arr[k] = leftArr[i];i++;k++;}while (j < n2) {arr[k] = rightArr[j];j++;k++;}
}// 递归实现归并排序
void mergeSortRecursive(std::vector<int>& arr, int left, int right) {if (left < right) {int mid = left + (right - left) / 2;mergeSortRecursive(arr, left, mid);mergeSortRecursive(arr, mid + 1, right);merge(arr, left, mid, right);}
}// 非递归实现归并排序
void mergeSortIterative(std::vector<int>& arr) {int n = arr.size();int currSize;for (currSize = 1; currSize <= n - 1; currSize = 2 * currSize) {for (int left = 0; left < n - 1; left += 2 * currSize) {int mid = std::min(left + currSize - 1, n - 1);int right = std::min(left + 2 * currSize - 1, n - 1);merge(arr, left, mid, right);}}
}int main() {std::vector<int> arr = {9, 4, 7, 2, 1, 5, 8, 3, 6};std::cout << "递归归并排序结果: ";mergeSortRecursive(arr, 0, arr.size() - 1);for (int num : arr) {std::cout << num << " ";}std::cout << std::endl;std::vector<int> arr2 = {9, 4, 7, 2, 1, 5, 8, 3, 6};std::cout << "非递归归并排序结果: ";mergeSortIterative(arr2);for (int num : arr2) {std::cout << num << " ";}std::cout << std::endl;return 0;
}
相关文章:

C++面试常考手写题目
C面试常考手写题目 vectorstringauto_ptrshared_ptrunique_ptrweak_ptrsingleton快排非递归heapheap_sortmerge_sort vector #include <bits/stdc.h> using namespace std;template<typename T> class vector {public:typedef T value_type;typedef T* iterator;p…...

LLM建模了什么,为什么需要RAG
LLM近期研究是井喷式产出,如此多的文章该处何处下手,他们到底又在介绍些什么、解决什么问题呢?“为学日增,为道日损”,我们该如何从如此多的论文中找到可以“损之又损以至于无”的更本质道或者说是这个方向的核心模型。…...

为开发GPT-5,OpenAI向微软寻求新融资
11月14日,金融时报消息,OpenAI正在向微软寻求新一轮融资,用于开发超级智能向AGI(通用人工智能)迈进,包括最新模型GPT-5。 最近,OpenAI召开了首届开发者大会,推出了GPT-4 Turbo、自定…...

创邻科技亮相ISWC 2023,国际舞台见证知识图谱领域研究突破
近日,第22届国际语义网大会 ISWC 2023 在雅典希腊召开,通过线上线下的形式,聚集了全球的顶级研究人员、从业人员和行业专家,讨论、发展和塑造语义网和知识图谱技术的未来。创邻科技CEO张晨博士作为知识图谱行业专家受邀参会&#…...

开源博客项目Blog .NET Core源码学习(6:雪花算法)
Blog .NET项目中有多种数据类生成对象实例时需要唯一标识,一般做法要么使用GUID,也可以保存到数据库时使用数据库表的自增长ID,也可以自定义规则以确保产生不重复的唯一标识,而在Blog .NET项目中使用雪花算法生成唯一标识。 关…...

【Python】集合与字典
按照输入顺序输出 将输入的名字去重,同时按照输入顺序输出 sinput().split(,) blist(set(s)) bsorted(b,keys.index) print(b) 删除集合元素、更新集合 根据操作删除更新集合 update括号里可以是一个集合,add只能是一个元素 discard用于删除元素&#x…...

【LeetCode】88. 合并两个有序数组
88. 合并两个有序数组 难度:简单 题目 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。 请你 合并 nums2 到 nums1 中,使合并后的数组同样按 非递减顺序 …...

Linux文件权限
R 代表可读 W 代表可写 X 代表可执行 文档类型有如下表示方法: d - 目录,例如上表档名为『.gconf』的那一行; - - 文档,例如上表档名为『install.log』那一行; l - 链接档(link file); b …...

〖大前端 - 基础入门三大核心之JS篇㉟〗- JavaScript 的DOM简介
说明:该文属于 大前端全栈架构白宝书专栏,目前阶段免费,如需要项目实战或者是体系化资源,文末名片加V!作者:不渴望力量的哈士奇(哈哥),十余年工作经验, 从事过全栈研发、产品经理等工作…...

CentOS中安装常用环境
一、CentOS安装 redis ①:更新yum sudo yum update②:安装 EPEL 存储库 Redis 通常位于 EPEL 存储库中。运行以下命令安装 EPEL 存储库 sudo yum install epel-release③:安装 Redis sudo yum install redis④:启动 Redis 服…...

python时间变化与字符串替换技术及读JSON文件等实践笔记
1. 需求描述 根据预测出结果发出指令的秒级时间,使用时间戳,也就是设定时间(字符串)转为数字时间戳。时间计算转换过程中,出现单个整数(例如8点),按字符串格式补齐两位“08”。字符…...

leetcode刷题日记:141. Linked List Cycle(环形链表)
这一题是给我们一个链表让我们判断这是否是一个环形链表,我们知道如果一个链表中有环的话这一个链表是没有办法访问到尾的, 假若有如图所示的带环链表: 我们从图示中很容易看出来这一个链表在访问的时候会在里面转圈,我们再来看看…...

html书本翻页效果,浪漫表白日记本(附源码)
文章目录 1.设计来源1.1 书本正面1.2 界面1-21.3 界面3-41.4 界面5-61.5 界面7-81.6 界面9-101.7 界面11-121.8 书本结尾 2.效果和源码2.1 动态效果2.2 源代码 源码下载 作者:xcLeigh 文章地址:https://blog.csdn.net/weixin_43151418/article/details/1…...

【Mysql】学习笔记
目录 基本操作登录指令:启动、关闭、重启mysql指令(适用于centos7):查看mysql运行状态:删除和创建表 修改密码(ubuntu18.04可行,其余版本行不行不知道)3 使用MYSQL了解数据库和表 4 …...

工作记录-------java文件的JVM之旅(学习篇)---好理解
一个java文件,如何实现功能呢?需要去JVM这个地方。 java文件高高兴兴的来到JVM,想要开始JVM之旅,它确说:“现在的我还不能进去,需要做一次转换,生成class文件才行”。为什么这样呢?…...

城市内涝对策,万宾科技内涝积水监测仪使用效果
随着城市化进程的加速,城市道路积水问题明显越来越多,给人们的出行和生活带来更多的不便。内涝积水监测仪作为高科技产品能够实时监测道路积水情况,为城市排水系统的管理和维护提供重要的帮助。 在城市生命线的基础设施规划之中,地…...

android的通知使用
在 Android 中,通知(Notification)是一种在状态栏显示消息的方式,通常用于向用户展示应用程序的重要信息、事件或更新。以下是一个简单的示例,演示如何在 Android 应用程序中使用通知: import android.app…...

001 opencv addWeighted
目录 一、环境 二、addWeighted函数 三、代码演示 一、环境 本文使用环境为: Windows10Python 3.9.17opencv-python 4.8.0.74 二、addWeighted函数 OpenCV中的cv.addWeighted函数是一个用于图像叠加的函数,它可以将两个具有相同尺寸和类型的图像按…...

2311rust,到35版本更新
1.32.0 rustup self update rustup update stablerustup更新自己. dbg宏 打印调试,你需要: let x 5; println!("{:?}", x); //甚至可能是 println!("{:#?}", x);在Rust1.32.0中,为此添加了个新的dbg!宏: fn main() {let x 5;dbg!(x); }如果运行此…...

UniPro提高集成能力 让客户专注于交付价值
一千个哈姆莱特就有一千个读者,一千个开发团队,也会有各不相同的软件工具和工作流程。工具与工具之间,功能上的割裂亦或重叠,都会给企业和团队的协作带来阻塞,结果就会导致团队之间各自为战、信息孤岛的形成以及资源的…...

Python---函数的作用,定义,使用步骤(调用步骤)
Python实际开发中,使用函数的目的只有一个 “让我们的代码可以被重复使用” 函数的作用有两个: ① 模块化编程 ② 代码重用 在编程领域,编程可以分为两大类:① 模块化编程 ② 面向对象编程 函数就是一个 被命名的、独立的…...

ERP智能管理系统:智能化的未来之路
ERP智能管理系统:智能化的未来之路 科技飞速发展,人工智能(AI)和大数据等先进技术的应用正在改变着企业的运营模式。其中,ERP智能管理系统在帮助企业实现智能化运营、提高效率、降低成本等方面发挥着越来越重要的作用。本文将为您详细介绍ERP…...

c++ memccpy和 = 都可以用于赋值操作
memccpy和都可以用于赋值操作,但它们的作用和使用方式有所不同。 是C中的赋值运算符,可以用于基本类型、对象、结构体等的赋值操作。对于结构体,它会执行成员到成员的赋值,也就是浅拷贝。如果结构体中有指针成员,赋值只…...

Golang for 循环中的隐式内存别名问题
Golang for 循环中的隐式内存别名问题 隐式内存别名是指在循环迭代过程中对同一变量的多次引用可能导致不可预期的结果。这主要涉及到 goroutine 和闭包的使用场景,在并发编程中容易引起 bug。 例如,下面的示例代码中存在隐式内存别名问题:…...

2023年亚太杯数学建模思路 - 复盘:光照强度计算的优化模型
文章目录 0 赛题思路1 问题要求2 假设约定3 符号约定4 建立模型5 模型求解6 实现代码 建模资料 0 赛题思路 (赛题出来以后第一时间在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 1 问题要求 现在已知一个教室长为15米,宽为12米&…...

Unity——利用Mesh绘制图形
什么是Mesh? Mesh 是用于表示和存储3D模型几何信息的类。它包含了顶点坐标、法线、UV坐标和其他与几何形状相关的数据,同时也包含了定义了这些数据如何连接以形成三角形的索引。 通过Mesh类,你可以创建、修改和渲染3D模型。一些常见的操作包括…...

web3资讯及远程工作
各位如果想了解区块链相关的消息可以通过如下网址了解,里面还会有相关职位招聘(包括远程工作),还可以在里面进行发帖,进入即可获得1000积分,后期可以兑换一些礼品Cryptosquare...

契约锁助力货物进出口全程无纸化,加速通关、降低贸易成本
我国作为全球最大的制造业国家和最大的货物贸易国家,政府始终注重引入数字化技术,创新管理和服务模式,帮助降低企业进出口成本,加速货物流通。 近年国家海关总署、商务部、税务总局及各地政府在进出口“报关”、“提货”、“收货备…...

生活中的综合能力
暖气管道不通 1 逐层排查哪层管道不通 2 排查该栋楼主管道和锅炉房总管道的连接口是否通畅 找不到主管道和总管道的连接口 查看其他楼和总管道的连接口 复盘: 先整体,后局部 求同求异思维:找差异,找正常暖气管道和异常暖气管…...

ES5中实现继承
本篇文章主要说明在ES5中最通用最兼容的继承实现方式,继承作为面向对象的三大特性之一,在js中实现继承对代码的简洁性,逻辑的连贯性都有很大的帮助。 实现思路 封装创建中间联系对象的函数 继承可以简单理解为建立子类和父类之间的联系&…...