![](https://img-blog.csdnimg.cn/20190918140037908.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
C++ STL
文章平均质量分 70
C++语言
m_buddy
大表哥,还有大招吗... PS:本人所有文章均免费公开,任何收费条目请咨询平台
展开
-
C++ STL 仿函数使用
1. 前言仿函数作为C++ STL 6大组件之一,它在行为类似函数,可作为算法的某种策略。这里补充C++ STL的6大组件的基本介绍:1. 容器:其中包含各种数据结构,如vector、list、deque、set、map,用来存储数据。从实现的角度来看,STL容器是一种class template。2. 算法:各种常用的算法如sort、search、copy、erase。从实现的角原创 2016-11-20 17:08:50 · 797 阅读 · 0 评论 -
Windows平台Socket通信实例
1. 概述Windows平台下的Socket通信方式主要采用的有TCP(SOCK_STREAM)通信和UDP通信(SOCK_DGRAM)两种。对于第一种通信方式需要建立可靠的连接且要进行校验;另外一种网络传输方式不需要建立可靠的连接,也不进行校验,使用在语音通信和视频通信中。下面就将对Windows平台下创建TCP通信进行流程的说明和相关解释。Windows上TCP通信的步骤:文件发送原创 2017-04-13 19:18:03 · 1674 阅读 · 0 评论 -
C++实现INI文件读写
1. 概述本文章主要参考这篇博客进行修改的,增加注释和修复了一些问题。这里给出完整的实现文件,在需要的地方包含该头文件就好了。2. 实现CMyINI.h#pragma once#include #include #include #include #include #include using namespace std;//INI文件结点存储结构clas原创 2017-01-05 19:41:23 · 15328 阅读 · 5 评论 -
C++实现遍历指定文件或文件夹
1. 概述在这片文章中将讲诉用C++实现实现遍历指定文件和文件夹,一个是基于Win32平台开发的,一个是基于MFC平台开发的,在这里贴出来与大家分享。在完成过程中参考了这篇博客2. 基于Win32平台开发定义的两个成员变量private: std::vector filepath; //保存图像数据的位置信息 char m_szInitDir[1000]; //初原创 2016-12-28 16:57:58 · 4072 阅读 · 0 评论 -
C++实现内存检测原理浅谈
前言之前已经介绍过了在Windows环境下和Linux环境下分别检测内存泄露使用的方法,但是这些内存检测的函数或是工具他们具体是依据什么样的原理来进行实现的呢?这里将在这篇文章中进行简单的分析和解读。1. 动态分配的原理当我们在程序中写下new和delete时,我们实际上调用的是C++语言内置的new operator和delete operator。所谓语言内置就是说我们不能更改其含原创 2017-07-12 00:05:07 · 1630 阅读 · 0 评论 -
Linux下使用valgrind工具对C++编程检测内存泄露
前言之前在这篇文章中已经讲过了对Windows平台下内存泄露问题的检测。今天这篇文章里面将主要对Linux下C++编程造成的内存泄露进行检查,使用到的工具是valgrind,当然在Linux下还有一些其它的工具可以作为内存泄露检测,这就挑选了一个强大且符合问题查找习惯的工具。1. 安装valgrind对于没有安装valgrind的用户可以使用sudo命令直接进行安装sudo apt原创 2017-07-11 21:35:32 · 1067 阅读 · 0 评论 -
C++STL 仿函数
1. 概述仿函数(functors)是早期的命名,C++标准规格定案后采用的新名称是函数对象(function objects)(也就是一种具有函数特质的对象)。仿函数的作用:在C++的STL提供的各种算法,例如sort()。往往有两个版本,其中一个是最长用的某种运算的版本(operator仿函数产生的原因:由于函数指针毕竟不能满足STL对抽象对象的需求,也不能满足软件积木原创 2017-06-11 18:05:53 · 2297 阅读 · 0 评论 -
C++ auto_ptr智能指针
前言auto_ptr是C++标准库中()为了解决资源泄漏的问题提供的一个智能指针类模板(注意:不是C++11标准中定义的,且这只是一种简单的智能指针)。使用auto_ptr主要是为了防止资源泄漏,我们通常在构造函数中申请,析构函数中释放,但是只有构造函数调用成功,析构函数才会被调用,换句话说,如果在构造函数中产生了异常,那么析构函数将不会调用,这样就会造成资源泄漏的隐患。1. auto原创 2017-07-12 16:57:44 · 664 阅读 · 0 评论 -
C++11 std::function和std::bind绑定器
前言C++11增加了std::function和std::bind,使得使用标准库函数时变得方便,而且还能方便地实现延迟求值。C++中,存在“可调用对象”这么一个概念。准确来说,可调用对象有如下的定义:(1)是一个函数指针(2)是一个具有operator()成员函数的类对象(仿函数)(3)是一个可被转换为函数指针的类对象(4)是一个类成员(函数)指针1. std::func原创 2017-07-05 13:06:38 · 2876 阅读 · 1 评论 -
C++11 Lambda表达式
前言lambda表达式是C++11最重要的也是最常用的一个特性之一。其实在C#3.5中就引入了lambda,java至今还没有引入,要等到Java8中才有lambda表达式。lambda表达式源于函数式编程的理念,也是现代编程语言的一个特点。lambda表达式具有如下的优点:(1)声明式编程风格:就地匿名定义目标函数或函数对象,不需要额外写一个命名函数或者函数对象。以更直接的方式去写程序,原创 2017-07-05 15:30:11 · 415 阅读 · 0 评论 -
C++11 可变模板参数
前言C++11 增强了模板功能,在C++11之前,类模板和函数只能含有固定数量的模板参数,现在C++11中的新特性可变参数模板允许模板定义中包含0到任意个模板参数。可变参数模板和普通模板的语义是一样的,只是写法上稍有区别,声明可变参数模板时需要在typename或class后面加上省略号“...”。其中的省略号的作用是:(1)声明一个参数包,这个参数包中可以包含0到人一个模板参数(2)原创 2017-07-06 11:07:39 · 603 阅读 · 0 评论 -
C++11 shared_ptr共享智能指针
前言std::shared_ptr使用引用计数,每一个shared_ptr的拷贝都指向相同的内存。在最后一个shared_ptr析构的时候,内存才会释放。1. shared_ptr基本使用方法1.1 初始化#include //智能指针初始化std::shared_ptr p(new int(20));cout << *p << endl;std::shared_ptr原创 2017-07-06 15:30:47 · 1328 阅读 · 0 评论 -
C++11 unique_ptr独占的智能指针
unique_ptr是一个独占型指针,让不允许其他的智能指针共享其内部的指针,不允许通过赋值将一个unique_ptr赋值给另外一个unique_ptr。unique_ptr p1(new int(0));unique_ptr p2 = p1; //错误unique_ptr不允许复制,但可以通过函数返回给其他的unique_ptr,还可以通过std::move来转移到其他的unique原创 2017-07-06 15:53:37 · 896 阅读 · 0 评论 -
素数判决和素数序列生成
前言质数又称素数。一个大于1的自然数,除了1和它自身外,不能被其他自然数整除的数叫做质数。1. 素数的判定方法1bool IsSushu(const int num){ if(num < 2) return false; int temp(num); for(int i=2; i<temp; ++i) { if原创 2017-07-27 10:11:00 · 987 阅读 · 0 评论 -
C++调用空指针对象的成员函数成功的理解
前言之前在与朋友聊天的时候说到C++中定义的空类对象指针(nullptr),也可以调用类的成员函数,不用进行具体的实例初始化。示范代码是这样的:class A{public: static void func1() { cout << __FUNCTION__ << endl; }public: void func2() {原创 2017-09-07 19:15:17 · 1408 阅读 · 0 评论 -
C++实现多级目录创建
1. 前言在编写C++程序的时候难免会操作到目录结构,一般来讲实现创建目录是使用_mkdir()函数,但是呢这个函数就只能创建一级目录,想要创建两级或是更多级的目录那就不行了。这里在总结了网上的资料将实现代码贴出,以供学习使用2. 实现#include "stdafx.h"#include <string>#include <iostream>#i...原创 2018-07-11 23:59:04 · 6134 阅读 · 0 评论 -
C++11实现argsort功能
1. 编码// 实现argsort功能template&lt;typename T&gt; std::vector&lt;int&gt; argsort(const std::vector&lt;T&gt;&amp; array){ const int array_len(array.size()); std::vector&lt;int&gt; arra原创 2019-01-10 23:14:27 · 5306 阅读 · 4 评论 -
C++使用opencv遍历文件夹
1. 前言之前用_finddata_t结构体做的C++文件夹遍历程序在Win10 VS2015环境下不能使用了,找了半天没找到原因,突然在网上看到使用Opencv也可以实现文件夹遍历的功能,这里对其进行了总结,主要分为3.0之前的版本和之后的版本。2. Opencv 2X实现在Opencv 2X的版本中包含了contrib模块,其里面封装了一个Directory类,用该类就可以实现对于目录的...原创 2019-01-14 23:15:46 · 2936 阅读 · 0 评论 -
C++模板全特化、偏特化
1. C++模板大家都对C++的模板编程应该都能很熟练使用了,下面就是一段很简单不过的例子了//模板函数template void func(T num1, N num2){ cout << "num1:" << num1 << ", num2:" << num2 <<endl;}//模板类template class Test_Class{ static b原创 2017-06-10 01:22:18 · 14700 阅读 · 4 评论 -
排序算法——归并排序
前言将待排序序列R[0...n-1]看成是n个长度为1的有序序列,将相邻的有序表成对归并,得到n/2个长度为2的有序表;将这些有序序列再次归并,得到n/4个长度为4的有序序列;如此反复进行下去,最后得到一个长度为n的有序序列。1. 编码//displaytemplate struct Disp{ void operator()(T value) {原创 2017-07-11 12:45:12 · 294 阅读 · 0 评论 -
C/C++面试知识点清理
1. 说明const与#define的特点及区别const常量存在于程序的数据段,并在堆栈分配了空间。const常量是一个Run-time的概念,它在程序中确确实实地存在着并可以被调用、传递。const常量有数据类型,而宏常量没有数据类型。编译器可以对const常量进行类型安全检查。2. C++中const有什么作用(1)const用于定义常量:const定义的常量编译器可以对其进原创 2017-05-11 21:12:34 · 544 阅读 · 0 评论 -
C++11 auto自动类型推导
1. auto类型推导下面是auto的使用举例:auto x =5; //正确,x是int类型auto pi = new auto(1); //正确,批是int*const auto* v = &x, u = 6; //正确,v是const int*类型,u是const intstatic auto y = 0.0; //正确,y是double类型auto int r原创 2017-06-01 10:12:46 · 8291 阅读 · 0 评论 -
C++虚函数实现原理
虚函数的定义也很简单直接加上修饰关键之virtual就可以了,之后派生类中进行override。但是需要理解虚函数的调用基理还是的从内存地址的角度去理解它。上面图中的左边是经常写的继承关系代码,右边是响应的对象在内存中的布局情况。这里讲到的virtual函数的实现机制要求对象携带额外的信息,这些信息用于在运行时确定该对象应该调用哪一个虚函数(基地址加上偏移量)。典型情况下,这一信息原创 2017-05-22 16:48:43 · 481 阅读 · 0 评论 -
C++虚函数原理和简单工厂模式
1. 概述2. 实现技术原理3. 编码4. 参考资料原创 2017-04-21 23:42:04 · 702 阅读 · 0 评论 -
C++虚函数与纯虚函数区别和重载的概念
1. 虚函数1.1 定义虚函数是在类中添加函数的修饰关键字“Virtual”,且对它进行定义,这时函数变被指定为虚函数。格式如下:class CInterFace{public: virtual void Func_Virtual(){}};1.2 作用虚函数的作用是允许在派生类中重新定义与基类同名的函数,并且可以通过基类指针或引用来访问基类和派生类中的同名函数。原创 2017-05-22 17:57:27 · 1320 阅读 · 1 评论 -
C++11 decltype关键字
1.1 decltype语法在C++11中增加了decltype关键字(表达式:decltype(exp)),用来在编译时推导出一个表达式的类型,并且不会真正计算表达式的值。int x = 0;decltype(x) y = 1; //y->intdecltype(x + y) z = 0; //z->intconst int& i = x;decltype(i) j =原创 2017-06-03 16:20:18 · 778 阅读 · 0 评论 -
C++11 模板改进
1.1 模板别名使用场景:typedef std::map map_int_t;typedef std::map map_str_t;上面的形式在C++98/03中,是不能实现直接。如果要定义如下的模板别名的时候,需要这样写:template struct map_str;{ typedef std::map type;};map_str::type kk;从上面可以看出如果原创 2017-06-03 16:26:00 · 403 阅读 · 0 评论 -
C++11 基于范围的for循环
1.1 for循环的新用法一般情况下在C++下遍历一个容器的方法是这样的std::vector array = {1, 2, 3, 4, 5};for(auto it=array.begin(), it !=array.end(); ++it){ std::cout << *it << "\t";}对于刷洗STL的用户的话知道在中有一个函数叫for_each算法来完成上诉的功能。原创 2017-06-03 20:29:29 · 2457 阅读 · 0 评论 -
排序算法——插入排序
前言算法的思想:将数据分成两部分,一部分是有序的部分,另外一部分为无序的部分。然后每次从无序区中取出一个元素,按照其大小插入到前面有序的区间中,直到全部无序的元素取完为止。就如上图所示,蓝色的是有序的,红色的是无序的。算法就是从无序元素中抽取一个插入到有序的区间中去。1. 编码template struct Disp{ void operator()(T valu原创 2017-07-10 19:07:09 · 301 阅读 · 0 评论 -
排序算法——折半插入排序
前言之前已经介绍过了插入排序的原理了。但是对于插入位置的选择就可以通过二分查找法的方式进行求取,加快算法运行。1. 编码template struct Disp{ void operator()(T value) { cout << value << "\t"; }};//折半插入排序void InsertSort2(std::vect原创 2017-07-10 19:16:21 · 358 阅读 · 0 评论 -
排序算法——希尔排序
前言希尔排序又称缩小增量排序,是时间效率较高的插入排序方法。算法的基本思想:先确定一个增量d(也叫间隙gap),然后按照增量的倍数所对应的数组下标值,从待排序序列中抽取数据元素组成若干子序列,然后对子序列分别做直接插入排序,这样的操作过程就是一趟希尔排序。进行下一趟希尔排序时,先确定一个更小的增量,然后再作以上操作,直到增量为1,做最后一次直接插入排序,由于序列基本已经有序,此时只需要很少原创 2017-07-10 19:25:54 · 348 阅读 · 0 评论 -
排序算法——冒泡排序
前言冒泡排序基本思想:假设数据元素存放于数组L中,初始化时,有序区为空,无序区为0~n-1;在无序区中,每次均从头至尾一次比较相邻的两个元素j和j+1,若存在逆序,则交换两者。每执行这一过程成为一趟冒泡排序。1. 编码template struct Disp{ void operator()(T value) { cout << value << "\原创 2017-07-10 19:32:23 · 353 阅读 · 0 评论 -
排序算法——快速排序
前言快速排序采用了分治法,即将原问题划分成为若干个规模更小且与原问题相似的子问题,然后递归地解决这些子问题,最后将他们组合起来。快速排序的思想是:假设数据元素存放在数组L中,当前序列为L[left]~L[right],left和right是当前序列的上下界;在序列中,任选一个数据元素L[pos](一般选择L[left],并成为枢轴)作为基准元素;然后,依次从序列的两端交替向序列中间扫描,将原创 2017-07-10 19:46:07 · 383 阅读 · 0 评论 -
排序算法——直接选择排序
前言算法基本思想:假设数据元素存放在数组L中,初始时,有序序列为空,将L[0]~L[n-1]作为无序区;每次从无序区中选出关键字最小的数据元素L[min],与无序区的第一个元素交换,使得有序区长度增长1,无序区减1.1. 编码template struct Disp{ void operator()(T value) { cout << value <原创 2017-07-11 00:34:34 · 298 阅读 · 0 评论 -
排序算法——堆排序
前言对于推排序它像合并排序而不像插入排序,堆排序的运行时间为O(nlogn)。像插入排序而不像合并排序,它是一种原地排序算法:在任何时候,数组中只有常数和元素存储在输入数组以外。这样堆排序就拥有了两种排序算法的优点。堆算法中涉及到的主要算法有:维持最大堆(Max_Heapify)和建立堆(Build_Max_Heap)。1. 编码实现这里为了使得数组的下标是从1开始计算的,在数组的原创 2017-07-11 00:35:03 · 360 阅读 · 0 评论 -
C++指针函数和函数指针
1. 前言有些时候当谈论到指针函数和函数指针的时候,有些朋友就可能会范懵了,好像名称都是差不多的样子呀,只是两个词组交换了下顺序。但是实际上他们实际代表的含义是不一样的。指针函数代表的是一个函数,只是他的返回值是一个指针;而函数指针代表的是一个指针,只不过这个指针指向了函数。2. 指针函数前面也说到了指针函数实际上、本质上是一个函数,并且返回值是某一类型的指针,它的定义是这样的返回原创 2017-06-10 00:21:51 · 392 阅读 · 0 评论 -
排序算法——计数排序
前言计数排序的思想:在给定的数组中,依次寻找比当前数字小的元素的个数(count),统计之后直接使用t就可以定位到该数所在的位置,因为比它小的元素的个数已经通过count计算出来了,所以直接填充就可以了。1. 编码//displaytemplate struct Disp{ void operator()(T value) { cout << val原创 2017-07-11 10:53:24 · 367 阅读 · 0 评论 -
RefineDet:(3)C++测试代码
代码地址:RefineDet相关链接:《RefineDet:Single-Shot Refinement Neural Network for Object Detection》论文笔记RefineDet:(1)训练脚本解析RefineDet:(2)检测部分网络解析1. 概述Python版本的测试代码在相应的文件夹下已经写好了,这里根据对应的Python文件写了一个测试Demo。...原创 2019-05-08 23:58:30 · 603 阅读 · 0 评论