c++
c语言和c++学习记录
Henry Zhao
这个作者很懒,什么都没留下…
展开
-
MatConvNet1.0bate25+win10+vs2015+matlab2017a GPU编译踩坑
MatConvNet1.0bate25+win10+vs2015+matlab2017a GPU编译踩坑开头按照下边这个搞,不出意外的话直接成功。(但一般会出意外----狗头表情)matconvnet安装、编译、配置 - 知乎 (zhihu.com)完了之后编译GPU的时候报这个错:(编译的过程会有大量warning这个不用管)error: …\Windows Kits\8.1\Include\um\combaseapi.h “IUnknown” is undefined解决办法:在Windows原创 2022-05-11 16:12:41 · 278 阅读 · 0 评论 -
快速排序简便写法,一次遍历找到pivot
“快速排序”简便写法,一次遍历找到pivotint Partition(vector<int>& arr, int l, int r){ int i = l, pivot = arr[r]; for(int j = l; j < r; ++j) { if(arr[j] < pivot) { swap(arr[i++], arr[j]); } } swap(arr原创 2021-04-02 15:41:15 · 199 阅读 · 0 评论 -
eventfd原理通俗解析
eventfd原理通俗解析职能分离:IO线程专门处理数据的收发,计算线程专门处理业务逻辑。问题:当计算线程接收到要发送给客户端的数据时,不能直接发送,必须由IO线程发送怎么办?计算线程要通知IO线程发送数据,涉及到线程之间的通信,子线程通知子线程。eventfd可以完成线程间通信(它的功能可以类比于timerfd)eventfd中的write()函数和read()函数通过同一个文件描述符进行读写,在一个线程中调用write()可以使内核计数器增加8字节整数,另一个线程中调用read()函数,它可以原创 2021-03-28 17:27:25 · 450 阅读 · 0 评论 -
ASCII码中10和13的含义
ASCII码中10和13的含义今天在看代码的时候遇到了这样一行代码if(top.size() == 1 && (static_cast<unsigned int>(top[0]) == 10 || static_cast<unsigned int>(top[0]) == 13)){ continue; } //top的类型为string首先中文的string一个字的size()为2 所以top.size() == 1表示这个字不是中文,那后面的10原创 2021-03-26 16:50:54 · 5274 阅读 · 2 评论 -
c++linux中make使用方法
目标文件:依赖 命令例:main.exe:hello.cc g++ hello.cc -o main.exe #g++ *.cc -o main.exe #编译所有.cc文件删除文件clean: rm -rf main.exe.o文件可以自动依赖于.cc文件如果有两个makefile文件我们可以通过以下命令来选择执行哪个makefile文件。make -f makefile2make只会执行第一个,想要所有语句都执行可以使用allall:hello.exe原创 2021-01-15 18:04:43 · 240 阅读 · 0 评论 -
c++ socket 实现客户端与服务端聊天功能
将发消息和接收消息交给两个不同的线程处理,通过while循环实现无限首发,输入”q“退出。server端void *recvMsg(void *arg){ pthread_mutex_lock(&mutex1); while(!flag) { pthread_cond_wait(&cond1, &mutex1); } int new_fd = *(int*)arg; char buff[1024] = {0}; cout << "waiting原创 2020-12-28 11:03:05 · 491 阅读 · 0 评论 -
c++智能指针
智能指针unique_ptr当unique_ptr被销毁时,会执行delete操作。不可以复制或赋值但是可以进行转移(内部具有移动语义的实现)shared_ptr复制时引用计数加1weak_ptr和shared_ptr联合使用时可以解决循环引用的问题。weak_ptr没有重载 *(解引用)和->所以无法直接访问资源如果要访问资源,只能使用lock()方法来提升为shared_ptr在类内部希望获取到本对像智能指针必须要继承自辅助类enable_shared_from_this不要将原创 2020-12-28 10:39:52 · 88 阅读 · 0 评论 -
linux多线程pthread使用
linux多线程pthread使用头文件pthread.hpthread_t pthid;pthread_create(&pthid, null, func, null)创建线程。pthread_join(pthid, NULL)等待该线程执行完毕后再退出,阻塞(线程挂起,不再占用CPU)。pthread_self()可获得本线程的id。%ld线程互斥锁pthread_mutex_t mutex1pthread_mutex_init(&mutex1, null)初始化互斥锁原创 2020-12-28 10:38:03 · 237 阅读 · 0 评论 -
socket网络编程
socket网络编程处理并发的方式1.多线程创建一个子线程将任务分配给子线程处理2.IO多路复用单线程处理多个客户端的请求select 多路选择poll 轮询epoll 基于事件的轮询解决阻塞问题acceptrecv/send 默认情况下都是阻塞的可以通过以下方式设置成非阻塞int listenfd = socket(AF_INET, SOCK_STREAM | SOCK_NONBLOCK, 0)fcntl();ioctl();select函数最后一个值没有设置原创 2020-12-28 10:37:29 · 87 阅读 · 0 评论 -
线程池原理
有少量请求创建线程 处理 回收线程交给一个线程处理,处理完毕后,得到一个结果,发送给客户端有大量请求例如一秒中发来3000个请求假设有8个线程生产者消费者模型(将3000个请求放到一个队列中,8个线程从队列中取任务并完成它)对于32为系统,1个进程最多能创建多少个线程?32位的操作系统,能够被用户态程序使用的虚拟地址空间大约只有3G每个线程都有自己的栈空间,通过栈空间的大小就可以推导出1个进程最多能开启的线程个数大约为3G/栈空间大小线程开的越多越好吗?原创 2020-12-28 10:36:54 · 75 阅读 · 0 评论 -
c++ static关键字
static定义静态成员首先它位于静态区静态成员函数不带this指针类内部的静态成员变量要在类之外进行初始化static_cast(expression)类型转换,把expression转换为typeid原创 2020-12-28 10:36:18 · 74 阅读 · 0 评论 -
c++linux中make使用方法
目标文件:依赖 命令例:main.exe:hello.cc g++ hello.cc -o main.exe #g++ *.cc -o main.exe #编译所有.cc文件删除文件clean: rm -rf main.exe.o文件可以自动依赖于.cc文件如果有两个makefile文件我们可以通过以下命令来选择执行哪个makefile文件。make -f makefile2make只会执行第一个,想要所有语句都执行可以使用allall:hello.exe原创 2020-12-28 10:34:36 · 455 阅读 · 0 评论 -
c++移动语义
移动语义为什么需要移动语义?答:节约资源哪里浪费资源了?我们要节约什么资源?答:以String类的构造函数为例class String{public: String(const String &rhs) :_data(new char[strlen(rhs._data) + 1]()) { strcpy(_data, rhs._data); cout << "String(const S原创 2020-12-17 21:17:16 · 318 阅读 · 0 评论 -
C、C++类型重定义
将char *类型重定义为iterator,即给它重新起了个名字,iterator就是 char *using char * = iterator//C++我们常用using来引入命名空间(using namespace std;),实际上它也可以用来“改名”typdef char * iterator //C语言用法...原创 2020-12-15 17:59:22 · 721 阅读 · 2 评论 -
c++模板template范式编程
可以使用它来简化代码,分为函数模板和类模板函数模板如:我们想要实现一个可以返回两个数之和的函数。我们需要把所有的类型通通重载一遍。int add(int x, int y) //定义两个int类型相加的函数{ return x + y;}double add(double x, double y) //重载double类型{ return x + y;}//long,long long, float...int main(){ add(x, y);//我们想写进任意类型的原创 2020-12-15 17:49:50 · 239 阅读 · 0 评论 -
c++虚函数的用法
虚函数机制如何被激活?基类定义虚函数,派生类重定义虚函数(即所谓的覆盖)创建派生类对象基类的指针指向派生类对象基类指针调用虚函数。构造函数和析构函数内访问虚函数即使是使用”this->虚函数名“的形式来调用,编译器仍将其解释为静态联编的"本类名::虚函数名",即它们所调用的虚函数是自己类中定义的,如果自己类中没有实现该函数,则调用基类中的虚函数,但一定不会调用任何派生类中重定义的虚函数。纯虚函数在基类中不给出具体实现,把它声明为纯虚函数,留给它的派生类去实现。这就是纯虚函数的作用。原创 2020-12-10 19:45:35 · 584 阅读 · 1 评论 -
c++explicit作用
首先我们要知道explicit作用是是表明该构造函数是显式的,类的构造函数默认情况下是隐式(implicit)的。显式声明和隐式声明的区别://不加explicit(隐式)class num{public: num(int n) { cout << n << endl; }};int main(){ num n1 = 10; //ok 这里发生了隐式转换 num n2(10); //ok return 0;}num n1 =原创 2020-12-10 19:41:36 · 190 阅读 · 4 评论 -
c++operator的两种用法
c++operator的两种用法第一种用法相信大家都很熟悉,即它是用来进行运算符重载第二种用法是用来进行隐式转换,如:class String{public: String(string s) :_s(s) {} operator string() { return _s; } private: string _s;};int main(){ String s("abcd"); string s1 =原创 2020-11-30 14:47:14 · 1538 阅读 · 0 评论 -
SFML+vs2019安装
SFML+vs2019安装1.创建一个c++空项目2.打开属性管理器3.添加新项目属性表在×64下单击鼠标右键添加成功后回到属性表×64找到刚刚添加的属性表单击鼠标右键–>属性单击找到SFML安装目录的include,复制路径粘贴到C/C+±->常规–>附加包含目录找到SFML安装目录的lib,复制路径粘贴到链接器–>常规–>附加库目录找到链接器–>输入–>附加依赖项添加lib文件夹中的库文件,添加以下五个即可:sfml-audio原创 2020-11-14 15:41:22 · 3589 阅读 · 4 评论 -
c++单例模式的自动释放问题
c++单例模式的自动释放问题1.嵌套类+静态对象#include <iostream>using std::cout;using std::endl;class Singleton{public: static Singleton * getInstance() { //使用懒汉模式时,在多线程环境下是非线程安全的 //可以通过加锁来实现线程安全 if(nullptr == _pInstance) { _pInstance = new Singleton()原创 2020-11-01 16:13:04 · 368 阅读 · 0 评论 -
c++设计模式之Pimpl
设计模式之Pimpl当两个公司进行合作的时候,A公司不想让B公司看到自己的核心代码是如何实现的,就可以用到此方法。Pimpl可以对类内部实现数据进行隐藏。有如下优点:提高编译速度;实现信息隐藏;减小编译依赖,可以用最小的代价平滑的升级库文件;接口与实现进行解耦;移动语义友好。代码示例: /// @file pimpl.h#include <iostream>using std::cout;using std::endl;class Po原创 2020-11-01 14:01:03 · 247 阅读 · 0 评论 -
c++读取整个txt文件三种方式
c++读取整个txt文件三种方式1.按行读取#include <iostream>#include <fstream>#include <string>#include <vector>using std::cout;using std::endl;using std::ifstream;using std::ofstream;using std::string;using std::vector;using std::cerr;v原创 2020-10-26 16:05:11 · 17396 阅读 · 1 评论 -
int main(int argc, char argv[]) argc和argv是什么意思?
int main(int argc, char *argv[]) argc和argv是什么意思?一个程序开始于对函数main()的调用。在这样做的时候,有两个参数被送给main(),其中的一个描述了命令行参数的个数,通常称为argc;另一个是命令行参数的数组,通常称为argv。命令行参数都是字符串,所以argv的类型是char* [argc+1]。该程序的名字也作为argv[0]传进来,所以argc的值至少是1。这个参数的表总以0结束,也就是说,argv[argc]==0带形参的函数如main(i原创 2020-10-14 14:22:04 · 2630 阅读 · 0 评论 -
c语言1.printf输出格式
几种类型数据的输出说明转义符有符号十进制整数%d、%i长整型数据%ld一十六进制输出整数%x字符%c无符号十进制整数%u字符串%s浮点数double\float%f小数点后保留m位%.mf指针%p%%%换行\nTable\t%d%%d\\\“”\"\"...原创 2020-09-04 17:50:31 · 207 阅读 · 0 评论