C/C++
文章平均质量分 58
畅游知识海洋
研究ffmpeg、H264和H265相关工作,从事安防工作,并在计算机视觉方面有一定的研究。
展开
-
c++11交替打印ab记录
//#include<pthread.h>#include#include#include#includeusing namespace std;std::mutex mtx;//static long long total = 0;//pthread_mutex_t m = PTHREAD_MUTEX_INITIALIZER;//long long i = 100;;atomic_llong i {100};int func(int){while(1){if(0 =原创 2020-06-30 20:02:23 · 313 阅读 · 0 评论 -
oj-2找出可以感染者
#include<iostream>#include<stdio.h>#include<set>#include<algorithm>using namespace std;int search(int **table, int a[100], int N, int M, int T){ set<int>b; set<int>::iterator iter; set<int>tmp_b; int ind原创 2020-05-20 15:29:42 · 322 阅读 · 0 评论 -
oj记录-1 确认感染群体集合
#include<iostream>#include<stdio.h>using namespace std;int merge(int v[100][100], int index, int N){ int tmp[100][100]; int i = 0, j = 0, k = 0, l = 0; int tmp_idx = 0; int flag = 0; int count = 0; for (i = 0; i < 100; i++){ memse原创 2020-05-19 10:26:15 · 271 阅读 · 0 评论 -
printf打印设置颜色和等级
直接上代码:#include<stdio.h>#define HL_RED "\033[1;31m" //高亮红色#define HL_GREEN "\033[1;32m" //高亮绿色#define HL_YEL "\033[1;33m" //高亮黄色#define BROWN "\033[0;33m" //灰色enum LOG_LEVEL{ LOG_LEVEL_OFF = 0, LOG原创 2020-05-12 16:20:39 · 1758 阅读 · 0 评论 -
c++类中public与private的默认情况
c++中,对类的成员(包括成员变量和成员函数)没有定义属性,默认是private。原创 2020-03-31 11:54:45 · 5447 阅读 · 0 评论 -
cmake3.5.1编译小结
安装ncurses-6.1:地址:https://ftp.gnu.org/pub/gnu/ncurses/./configure下载cmake配置ncurses安装目录:export PATH=/usr/local/lib:$PATH编译参数:./configure --prefix=/usr/原创 2020-03-26 16:33:48 · 325 阅读 · 0 评论 -
operator操作符
111原创 2020-03-25 09:27:56 · 293 阅读 · 0 评论 -
C/C++结构体初始化
针对C/C++中定义的结构体,如何初始化其实是一门很深的学问,很多项目的bug是由结构体初始化造成的。struct A { int a; int b[2]; char *c; string d;}A1不如上面的结构体,如何针对这四个不同类型的变量进行初始化?1.最直接的方式struct A a={1,{1,2},NULL,""};2.利用指针A *st=new A();st->原创 2017-09-19 20:01:55 · 1137 阅读 · 0 评论 -
C++字符串分割
字符串切割的使用频率还是挺高的,string本身没有提供切割的方法,但可以使用stl提供的封装进行实现或者通过c函数strtok()函数实现。1、通过stl实现涉及到string类的两个函数find和substr: 1、find函数 原型:size_t find ( const string& str, size_t pos = 0 ) const; 功能:查找子字符串第一次出现的位置。转载 2017-10-10 16:24:53 · 294 阅读 · 0 评论 -
c++11获取线程返回值
#include //std::cout std::endl#include //std::thread#include //std::future std::promise#include //std::ref#include //std::chrono::secondsvoid initiazer(std::promise &promis原创 2018-01-24 10:13:52 · 2368 阅读 · 0 评论 -
Linux下C/C++如何使用共享库so
从源代码到可执行程序,通常要经过最重要的两大步是:编译,链接。编译就是将源文件生成中间文件的过程,在linux下就是生成 .obj 文件。链接就是用链接器将,这些个中间文件有序地”糅合“在一起,构成一个可执行文件。通常,一个.c文件或者.cpp源文件编译后,就会对应生成一个.obj文件。 那么库文件是什么东西呢?其实库文件就是将这些中间文件.obj进行打包生成的文件转载 2018-01-16 13:57:27 · 676 阅读 · 0 评论 -
c++11 实现两个线程交替同步
#include #include #include #include std::mutex data_mutex;std::condition_variable data_var;bool label = false;void printodd(){ std::unique_lock ulock(data_mutex); for (int odd = 1; odd <=原创 2018-01-26 16:40:28 · 2045 阅读 · 0 评论 -
c++ sdl调用找不到入口点
首先是 总是提示你找不到 入口函数 . 新建个 console 工程,写好 int main(int argc,char* argv[]) 之后,死活 告诉你没有入口 。最后原因是因为 SDL 的头文件里 #define main SDL_main ,做了这样的 宏定义后,main函数当然就找不到了。 解决的办法:在工程/属性/链接器/高级 里面,把入口点 修改为 SDL_mai原创 2018-01-10 11:06:06 · 934 阅读 · 0 评论 -
c++ uniqure_lock 多线程
unique_lockunique_lock是一个对象,它在两个状态中都拥有唯一所有权的互斥对象:锁定和解锁。在构造上(或者通过移动分配给它),对象获得一个互斥对象,由它的锁定和解锁操作负责。该对象支持两种状态:锁定和解锁。该类保证了销毁时处于的解锁的状态(即使没有显式地调用)。因此,它作为具有自动持续时间的对象特别有用,因为它可以保证互斥对象在抛出异常时被正确地解锁。但是请注意,uniquelo...原创 2018-03-06 14:31:57 · 332 阅读 · 0 评论 -
长字符串转换为数字
定义于头文件<cstdlib> unsignedlong strtoul(constchar*str,char**str_end,intbase); unsignedlonglongstrtoull(constchar*str,char**str_end...原创 2019-03-07 11:10:53 · 2036 阅读 · 0 评论 -
linux gcc _attribute__((weak)) 简介及作用
最新在看项目新架构代码上看到了有使用到weak,以前没有看到过,所以写一篇文章以作记录。场景:A,B两个模块,A模块调用了不确定B模块是否提供了函数,但是又不得不调用,这个时候在A模块中再申明一个弱符号函数,即用weak,如果外部提供了调用外部的,如果没提供调用申明的。弱符号:若两个或两个以上全局符号(函数或变量名)名字一样,而其中之一声明为weak属性,则这些全局符号不会引发重定义错误。...转载 2019-03-12 13:54:43 · 3181 阅读 · 0 评论 -
c标准IO库使用
虽说大部分场合能用c的都可以用c++代替,但是对于开发库,还是用c效率高。下面介绍c标准IO库: 文件操作标准I/O库函数:fopen、fread、fwrite、fclose、fflush、fseek、fgetc、getc、getchar、fputc、putc、putchar、fgets、gets、printf、fprintf、sprintf、scanf、fscanf、sscanf、fgetops原创 2017-11-30 11:08:31 · 647 阅读 · 0 评论 -
static的用途
书上都说,static有三个特点:隐藏、只初始化一次和限于本文件范围使用,下面我开始分析一波,在类中的使用方式。为何在类中使用,因为static不受类实例化的约束,多个实例可以共享static变量和函数,那么作用还是显而易见的,下面请看代码:class A { static float a; const static int b = 30;public: static vo原创 2017-11-24 15:01:31 · 340 阅读 · 0 评论 -
C++ explicit作用
C++中, 一个参数的构造函数(或者除了第一个参数外其余参数都有默认值的多参构造函数), 承担了两个角色: 1)构造器 ; 2)默认且隐含的类型转换操作符。 所以, 有时候在我们写下如 AAA = XXX, 这样的代码, 且恰好XXX的类型正好是AAA单参数构造器的参数类型, 这时候编译器就自动调用这个构造器, 创建一个AAA的对象。 这样看起来好象很酷, 很方便。 但在某些情况下(见下面权威的原创 2017-11-10 18:05:07 · 295 阅读 · 0 评论 -
c++11新容器 tuple
tuple顾名思义是元组的意思,提起元组应该并不陌生,很受欢迎的python就有元组的概念,大家感兴趣可以去看看,这里主要介绍tuple的结构和常用使用方法。首先来看官方给出元组的说明:元组(tuple)由预先确定数量的多种对象组成.元组可以看作是struct数据成员的泛化.TR1 tuple类型的C++11版本获益于像可变参数模板这样的C++11语言特性.TR1版本的元组需要一个由实现定义的包含的原创 2017-10-12 10:46:15 · 458 阅读 · 0 评论 -
C++中的list容器如何插入和删除第i个元素
使用C++中的list容器,假设定义了一个list nlist(30);和迭代器list::iterator pnlist = nlist.begin(); 现在我想删除nlist中的第i个元素如何删除?我写的是nlist.erase(pnlisr+i);但是报错,原因是一个整型的i不能跟nlist直接相加。请问如何才能解决了这个问题?list<int>::iterator pnlist = nli原创 2017-10-11 16:30:29 · 6428 阅读 · 3 评论 -
STL 慎重选择删除元素的方法
假设你有一个容器,Containerc,针对连续内存容器(vector、deque或string),那么最好用erase-remove的习惯用法:c.erase(remove(c.begin(),c.end(),4),c.end());对于list,可以采用如下方式:c.remove(4);当c为标准关联容器时,例如set,multiset,map或multimap时,使用任何名为remove的操作原创 2017-10-27 14:25:53 · 771 阅读 · 0 评论 -
C++ STL入门篇
STL中有迭代器、算法和函数对象,但是对于大多数c++程序员来说,最值得注意的还是容器。容器比数组功能更加强大、更加灵活。他们可以动态增长(缩减),可以管理自己的内存,总之非常方便我们解决很多问题。下面介绍c++提供的STL封装:1.标准STL序列容器:vector,string,deque和list。 2.标准STL关联容器:set, multiset, map和multimap。 3.非标准原创 2017-10-10 15:00:52 · 399 阅读 · 0 评论 -
C/C++中输入带空格的字符串用法总结
在C/C++中,传统的输入流scanf(“%s”,&str) 和cin>>str,遇到空格会返回空格之前的字符串。但是在很多应用中,我们需要字符串中可以同时包含空格,那么前面的两种方法现在就不可用了,在C/C++中给我们提供了那些输入流处理方式呢。下面是我总结的几种常用的方法:(1)gets(char *str) 需要包含头文件#include <stdio.h>(2)scanf("%[^\n]转载 2017-10-19 10:01:34 · 1834 阅读 · 0 评论 -
CImg库入门介绍
CImg库早在2004年就已经被使用,它是一个跨平台的C++的图像处理库,提供了加载、处理、显示、保存等一系列功能,其中的图像处理功能尤其强大。如果对图像处理要求不是很严格,可以结合CImg库进行封装和开发。 下面是官方提供的CImg的Demo: 主页地址:http://cimg.sourceforge.net/ 下载地址:http://cimg.sourceforge.net/downloa原创 2017-09-27 17:17:01 · 1539 阅读 · 0 评论 -
VS项目引用的使用
程序调用到其他二进制文件(如 DLL、Windows 运行时组件、扩展 SDK、COM 组件和 .NET 程序集)中的 API 的情况非常普遍。 程序找到其他此类库的方式取决于项目的类型,以及二进制文件的类型。在本机 C++ 项目中,如果你正在使用并非由解决方案中其他项目生成的本机 DLL 或 COM 组件,你将使用 LoadLibrary 或 CoCreateInstance 来指定指向二进制文件原创 2017-09-15 18:19:30 · 5594 阅读 · 0 评论 -
C++字符串陷阱
通常,我们会这样定义字符串并初始化:char *str="string";这样定义虽然能够快速的获取字符串元素值,但是这些字符串是存储在文字常量表中,不能被修改。如果使用指针修改值,将会抛出异常。下面上一段程序:char* Strsep(char** stringp, const char* delim){ char *begin, *end; begin = *stringp;原创 2017-08-24 12:51:46 · 328 阅读 · 0 评论 -
Linux 使用gdb对c/c++代码进行调试
c/c++开发的工作者常常需要考虑跨平台使用的问题,那么在linux上编译是必不可少的一部分。gdb是linux下的c/c++调试工具,具体安装(这里用的是centos的系统,其它系统也大同小异):yum install gdb我们来一段c++代码,命名为test.cpp:#include<iostream>using namespace std;int main(){int a=0;int原创 2017-09-13 20:04:41 · 639 阅读 · 0 评论 -
如何让程序优雅的崩溃
虽然是大公司的产品,QQ它还是会在我们的折腾下崩溃的,但是它总是崩溃的很优雅,还要弹出自己的对话框来结束。并且发送报告,去掉了系统默认的发送报告的对话框。所以一拍脑袋,想让自己的程序崩溃的体面一点。自己想了大概的思路,觉得可以用一个进程来监控目标程序。的确也可以拿到了目标程序崩溃的信息,知道它什么时候崩溃的,也可以做额外的操作,但是这样是没办法把默认的发送错误的对话框去掉的。然后又有人说是不是采用了转载 2017-08-28 09:30:27 · 1233 阅读 · 0 评论 -
C++11标准 正则表达式
1.介绍 新的标准库定义了一个新的头文件<regex>,由一些新的类组成: 1.正则表达式由模板类std::regex的实例来表示; 2.模式匹配由的结果模板类std::match_results的实例来表示; 3.函数 regex_search 是用来搜索模式的; 若要搜索并替换,则要使用函数 regex_replace,该函数会返回一个新的字符串。算法regex_search 和 reg原创 2017-10-12 12:00:08 · 1379 阅读 · 0 评论 -
正则表达式-字符串分割
C++不像java那样,有自己的字符串分割函数,那么我们在实际应用中如何快速对某些规定格式的字符创进行分割,并提取内容呢? 下面来看代码: 针对IP地址,如何分割:10:22:192:34/17 //子表达式匹配 regex reg2("(\\d{1,3}):(\\d{1,3}):(\\d{1,3}):(\\d{1,3})/(\\d{1,3})"); vector<stri原创 2017-10-12 14:29:27 · 3336 阅读 · 0 评论 -
C++11 通用智能指针
记录下,C++11标准下的通用智能指针,请注意shared_ptr是类,并不是真正的指正,具体用法如下所示:#include <iostream>#include <string>#include<memory>using namespace std;int main() { std::shared_ptr<double> p_first(new double); {原创 2017-10-12 16:16:02 · 390 阅读 · 0 评论 -
C++强制转换符
1. dynamic_cast: 通常在基类和派生类之间转换时使用。 特点: 1)在运行期,会检查这个转换是否可能。 2)完成类层次结构中的提升。T必须是一个指针、引用或无类型的指针。a必须是决定一个指针或引用的表达式。 3)dynamic_cast 仅能应用于指针或者引用,不支持内置数据类型 4)表达式dynamic_cast<T*>(a) 将a值转换为类型为T的对象指针。如果类型T不是原创 2017-11-23 12:01:25 · 487 阅读 · 0 评论 -
C/C++中volatile关键字详解
1. 为什么用volatile?C/C++ 中的 volatile 关键字和 const 对应,用来修饰变量,通常用于建立语言级别的 memory barrier。这是 BS 在 “The C++ Programming Language” 对 volatile 修饰词的说明:A volatile specifier is a hint to a compiler that an object ma转载 2017-11-30 10:09:40 · 156 阅读 · 0 评论 -
c++ STL map解析
map是用来存放#include <map> #include <string> #include <iostream> using namespace std;struct CmpByKeyLength { bool operator()(const int& k1, const int& k2) { return k1 > k2; }};class原创 2017-10-13 17:12:19 · 351 阅读 · 0 评论 -
C++ STL list
list作为C++STL顺序容器,担任着重要的决策。它的插入和删除的时间复杂度为O(1),底层采用双向链表的结构。不多说了,直接上代码:#include <iostream>#include <list>#include <numeric>#include <algorithm>using namespace std;//创建一个list容器的实例LISTINTtypedef list<原创 2017-10-16 15:38:46 · 284 阅读 · 0 评论 -
避免使用vector<bool>
vector作为容器,有以下两点不对:1)它不是stl容器 2)它并不存储bool 如果c是包含对象T的容器,而且c支持operate[],那么下面的代码必须能够被编译:T *p= &c[0]因此,vector是一个容器,那么下面的这段代码必须可以被编译:vector<bool> v;bool *pb=&v[0]; //变量地址初始化一个bool*变量结果,上述表达式并不能编译,原因是vecto原创 2017-11-01 20:29:02 · 614 阅读 · 0 评论 -
危险的_strdup函数
_strdup函数定义如下:char * __strdup (const char *s) { size_t len = strlen (s) + 1; void *new = malloc (len); if (new == NULL) return NULL; return (char *) memcpy (new, s, len); } 从原创 2017-11-10 11:15:33 · 5267 阅读 · 0 评论 -
C++ STL set和multiset
1.概念 set的含义是集合,它是一个有序的容器,里面的元素都是排序好的,支持插入,删除,查找等操作,就 像一个集合一样。所有的操作的都是严格在logn时间之内完成,效率非常高。 set和multiset的区别是:set插入的元素不能相同,但是multiset插入的元素可以相同。std::set<int> s;s对象里面存贮的元素是从小到大排序的。(因为默认用std::less作为比较工具,这原创 2017-10-13 11:03:53 · 322 阅读 · 0 评论 -
STL 去除多余的容量
虽然stl容器可以动态分配空间,尤其是顺序容器。但是很多情况下,为了避免对内存的多次分配,将会预先给容器分配很大的内存空间,等数据分配完成后,再进行去除多余的空间,这种方式可以有效提供程序的效率。这里采用下面的做法,可以从容器中去除多余的向量:vector<Constestant>(constestants).swap(constestants);代码如下:#include<iostream>#i原创 2017-10-30 17:42:02 · 506 阅读 · 0 评论