<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[uestc_chenmo的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/uestc_chenmo</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; uestc_chenmo]]></copyright><item><title><![CDATA[字符编码问题：ANSI、ASCII、UNICODE、UTF8、GBK及其相互转换]]></title><link>https://blog.youkuaiyun.com/uestc_chenmo/article/details/82191183</link><guid>https://blog.youkuaiyun.com/uestc_chenmo/article/details/82191183</guid><author>uestc_chenmo</author><pubDate>Wed, 29 Aug 2018 19:19:29 +0800</pubDate><description><![CDATA[在使用tesseract时，不可避免地会遇到各种字符编码问题。 
各种ANSI、UNICODE、UTF8、GBK总是搞不清楚，制作训练样本时刚好借机了解了下字符编码相关问题，在此记录备忘。

首先介绍最熟悉的ascii码（American Standard Code for Information Interchange，美国信息互换标准代码）： 
使用8位二进制，0-127表示128个字符，其中...]]></description><category></category></item><item><title><![CDATA[C++应用系列：STL中sort函数与自定义cmp比较排序]]></title><link>https://blog.youkuaiyun.com/uestc_chenmo/article/details/81489524</link><guid>https://blog.youkuaiyun.com/uestc_chenmo/article/details/81489524</guid><author>uestc_chenmo</author><pubDate>Tue, 07 Aug 2018 22:07:29 +0800</pubDate><description><![CDATA[平常使用时，在写sort函数的比较函数时，通常都是：



bool cmp(int i1,int i2){
    return i1 &amp;lt; i2;
}
void foo(){
    sort(vec.begin(),vec.end(),cmp);
}



习惯用法后，在一些类中，同样这样写就出现了错误。

class InClass{
bool cmp(int i1,int i2){
...]]></description><category></category></item><item><title><![CDATA[C++应用系列：仿AOP与匿名对象实现运行时间测试]]></title><link>https://blog.youkuaiyun.com/uestc_chenmo/article/details/80929241</link><guid>https://blog.youkuaiyun.com/uestc_chenmo/article/details/80929241</guid><author>uestc_chenmo</author><pubDate>Thu, 05 Jul 2018 16:32:10 +0800</pubDate><description><![CDATA[之前通过装饰器模式实现了打印运行时间，使用起来稍微方便一些了，但是每次测试时还需要创建一个新的时间测试类继承于基类，并在该类成员函数中调用实际需要测时间的函数。 
在看AOP时发现还有另一种实现方式：

template &amp;lt;class T&amp;gt;
class BaseAspect
{
    T* m_ptr;
protected:
    BaseAspect(T* ptr):m_ptr(...]]></description><category></category></item><item><title><![CDATA[C++应用系列：利用装饰器模式进行运行时间测试]]></title><link>https://blog.youkuaiyun.com/uestc_chenmo/article/details/80920101</link><guid>https://blog.youkuaiyun.com/uestc_chenmo/article/details/80920101</guid><author>uestc_chenmo</author><pubDate>Thu, 05 Jul 2018 13:02:56 +0800</pubDate><description><![CDATA[在平常做实验时，经常会遇到需要测试某个函数或个模块的运行时长，基本上每次都是在模块前后添加测时间的函数，然后输出查看，这样的工作相当繁琐，然而每次测试还是这样做的。

今天上网看到AOP相关，发现可以用AOP添加测时间功能。 
又看到了代理模式和装饰器模式，发现应用装饰器模式似乎可以简单实现。



class VBase
{
public:
    virtual ~VBase(){}
    ...]]></description><category></category></item><item><title><![CDATA[不务正业系列：看STL中迭代器与traits时突然想到decltype]]></title><link>https://blog.youkuaiyun.com/uestc_chenmo/article/details/80444581</link><guid>https://blog.youkuaiyun.com/uestc_chenmo/article/details/80444581</guid><author>uestc_chenmo</author><pubDate>Thu, 24 May 2018 22:03:08 +0800</pubDate><description><![CDATA[看《STL源码剖析》中讲到迭代器与traits时做了下笔记。 
详见：https://blog.youkuaiyun.com/uestc_chenmo/article/details/80444092 
做笔记过程中突然想到，参数类型和返回值类型问题似乎很贴近auto和decltype。 
编译器会在编译时通过变量的初始值或表达式自动推导变量的类型。具体网上资料很多此不赘述。 
STL出现较早，其中的trai...]]></description><category></category></item><item><title><![CDATA[C++进阶系列：参数推导、内嵌类型、迭代器与traits]]></title><link>https://blog.youkuaiyun.com/uestc_chenmo/article/details/80444092</link><guid>https://blog.youkuaiyun.com/uestc_chenmo/article/details/80444092</guid><author>uestc_chenmo</author><pubDate>Thu, 24 May 2018 21:26:43 +0800</pubDate><description><![CDATA[《STL源码剖析》学习记录：

模板编程中经常写到：

template&amp;amp;amp;lt;typename T&amp;amp;amp;gt;
void func0(T a)
{
    T aa;
    //do_sth();
    return;
}
template&amp;amp;amp;lt;typename T&amp;amp;amp;gt;
T func1()
{
    T tmp;
    //do_sth();
    return tmp;
}

当模...]]></description><category></category></item><item><title><![CDATA[C++进阶系列：C++模板特化与偏特化]]></title><link>https://blog.youkuaiyun.com/uestc_chenmo/article/details/80412353</link><guid>https://blog.youkuaiyun.com/uestc_chenmo/article/details/80412353</guid><author>uestc_chenmo</author><pubDate>Tue, 22 May 2018 21:44:09 +0800</pubDate><description><![CDATA[《STL源码剖析》第三章讲迭代器时有讲模板特化相关。

C++模板包含类模板与模板函数：



template &amp;lt;class T&amp;gt;
class Template_Class
{
     //成员函数等
     T Data;
};   //类模板  

template &amp;lt;class T&amp;gt;
T Template_func(const T a, const T b)
{...]]></description><category></category></item><item><title><![CDATA[C++进阶系列：new与Plain Old Data]]></title><link>https://blog.youkuaiyun.com/uestc_chenmo/article/details/80397655</link><guid>https://blog.youkuaiyun.com/uestc_chenmo/article/details/80397655</guid><author>uestc_chenmo</author><pubDate>Mon, 21 May 2018 20:50:40 +0800</pubDate><description><![CDATA[《深度探索c++对象模型》 P196 
Point* heap = new Point; 
通常理解的new一个对象进行3个步骤： 
1.分配一块内存空间 
2.调用对象构造函数 
3.指定 指向该对象的指针

书中有说到：“再一次容我强调，并没有default constructor施行于 new 运算符所传回的Point Object身上。”

当一个类无需构造的时候,如：

class Fo...]]></description><category></category></item><item><title><![CDATA[C++进阶系列：拷贝构造函数与NRV优化]]></title><link>https://blog.youkuaiyun.com/uestc_chenmo/article/details/80342719</link><guid>https://blog.youkuaiyun.com/uestc_chenmo/article/details/80342719</guid><author>uestc_chenmo</author><pubDate>Wed, 16 May 2018 20:43:19 +0800</pubDate><description><![CDATA[《深度探索C++对象模型》第二章67页有： 
这个程序的第一个版本不能实施NRV优化，因为test class 缺少一个copy constructor. 
也就是缺少拷贝构造函数所以不能NRV优化。

NRV优化和拷贝构造函数是有关系的，只有定义了拷贝构造函数才会开启NRV优化，但现代编译器NRV优化的开启一般都与拷贝构造函数没有关系，

早期的 cfront需要一个开关来决定是否应该对代码实行...]]></description><category></category></item><item><title><![CDATA[C++应用系列：字符串输入输出]]></title><link>https://blog.youkuaiyun.com/uestc_chenmo/article/details/80051964</link><guid>https://blog.youkuaiyun.com/uestc_chenmo/article/details/80051964</guid><author>uestc_chenmo</author><pubDate>Mon, 23 Apr 2018 16:14:59 +0800</pubDate><description><![CDATA[#include &amp;lt;iostream&amp;gt;
#include &amp;lt;sstream&amp;gt;
#include &amp;lt;vector&amp;gt;
#include &amp;lt;string&amp;gt;

using namespace std;

int main()
{
    string str;
    getline(cin, str);      //读入一行字符，保存空格，换行结尾
  ...]]></description><category></category></item><item><title><![CDATA[操作系统之多线程（二）]]></title><link>https://blog.youkuaiyun.com/uestc_chenmo/article/details/79640721</link><guid>https://blog.youkuaiyun.com/uestc_chenmo/article/details/79640721</guid><author>uestc_chenmo</author><pubDate>Wed, 21 Mar 2018 15:24:24 +0800</pubDate><description><![CDATA[同步与锁： 
同步：多线程中，一个线程访问数据未结束时，其他线程不得访问同一数据，数据的访问被原子化。最常见的方法是使用锁（Lock）。线程在访问数据或资源前获取锁，访问结束后释放锁，在锁被占用时线程获取锁会等待至锁可用。 
二元信号量： 
只有占用、非占用两种状态。只能被唯一线程独占访问的资源。 
多元信号量（Semaphores）： 
简称信号量，允许多个线程并发访问的资源，初始值为N的信号量...]]></description><category></category></item><item><title><![CDATA[C++基础系列：访问控制与继承]]></title><link>https://blog.youkuaiyun.com/uestc_chenmo/article/details/79584589</link><guid>https://blog.youkuaiyun.com/uestc_chenmo/article/details/79584589</guid><author>uestc_chenmo</author><pubDate>Fri, 16 Mar 2018 17:25:55 +0800</pubDate><description><![CDATA[public：公有继承，继承后的各成员不会其改变控制方式； 
基类public -&amp;gt; 派生类public 
基类protected -&amp;gt; 派生类protected 
基类private -&amp;gt; 派生类不可访问

protected：受保护的继承，继承后的成员变为protected； 
基类public -&amp;gt; 派生类protected 
基类protected -&amp;gt; 派生...]]></description><category></category></item><item><title><![CDATA[C++应用系列：用智能指针shared_ptr中引用计数思想进行动态内存管理]]></title><link>https://blog.youkuaiyun.com/uestc_chenmo/article/details/79569481</link><guid>https://blog.youkuaiyun.com/uestc_chenmo/article/details/79569481</guid><author>uestc_chenmo</author><pubDate>Thu, 15 Mar 2018 16:02:46 +0800</pubDate><description><![CDATA[如果在类的定义中不自己定义默认拷贝赋值构造函数与析构函数，编译器会自动创建合成函数，在初始化时使用类内初始值或默认值初始化成员。  
编译器自动生成提供的默认拷贝构造函数是浅拷贝，所谓浅拷贝，则是简单将成员进行赋值操作，如果成员中存在指针或引用时，执行浅拷贝则只是将指针或引用赋值，而具体指向的是同一内存空间，在修改值时会出现意想不到的问题，而且，最重要是在析构时同一内存单元重复释放两次。

当我们...]]></description><category></category></item><item><title><![CDATA[C++进阶系列：深拷贝浅拷贝函数与拷贝赋值操作符]]></title><link>https://blog.youkuaiyun.com/uestc_chenmo/article/details/79497060</link><guid>https://blog.youkuaiyun.com/uestc_chenmo/article/details/79497060</guid><author>uestc_chenmo</author><pubDate>Fri, 09 Mar 2018 14:27:46 +0800</pubDate><description><![CDATA[类使用构造函数对对象进行初始化外，还有拷贝、赋值、销毁等操作。 
如果在类的定义中不自己定义默认拷贝赋值构造函数与析构函数，编译器会自动创建合成函数，在初始化时使用类内初始值或默认值初始化成员。 
编译器自动生成提供的默认拷贝构造函数是浅拷贝，所谓浅拷贝，则是简单将成员进行赋值操作，通常如果类成员只有简单数据成员时，浅拷贝不会出现任何问题。但是，如果成员中存在指针或引用时，执行浅拷贝则只是将指针或...]]></description><category></category></item><item><title><![CDATA[Tesseract应用：ScrollView.jar以及ViewDebugging的使用及相关问题]]></title><link>https://blog.youkuaiyun.com/uestc_chenmo/article/details/78814508</link><guid>https://blog.youkuaiyun.com/uestc_chenmo/article/details/78814508</guid><author>uestc_chenmo</author><pubDate>Fri, 15 Dec 2017 16:33:32 +0800</pubDate><description><![CDATA[tesseract中提供了一个显示其内部状态的工具ViewDebugging 
官网：https://github.com/tesseract-ocr/tesseract/wiki/ViewerDebugging主要是依赖生成的ScrollView.jar，具体生成方法可以参照 
http://blog.youkuaiyun.com/uestc_chenmo/article/details/78668681]]></description><category></category></item><item><title><![CDATA[Java应用系列：命令行生成jar包（附IJ Idea导出jar方法）]]></title><link>https://blog.youkuaiyun.com/uestc_chenmo/article/details/78668681</link><guid>https://blog.youkuaiyun.com/uestc_chenmo/article/details/78668681</guid><author>uestc_chenmo</author><pubDate>Wed, 29 Nov 2017 19:21:12 +0800</pubDate><description><![CDATA[jar包 
JAR（Java Archive，Java 归档文件）是与平台无关的压缩文件，通常是用于将多个class文件组合成一个，。当创建jar包的时候，如果程序中有main入口函数，同时manifest中指定了Main-Class，即可创建可执行的jar，即相当于一个Java应用程序，(有jre时)可以通过命令行或直接双击运行。生成jar方法： 
命令行参数：jar {ctxu}[vfm..]]]></description><category></category></item><item><title><![CDATA[C++应用系列：递归遍历文件夹下所有文件--Directory类源码中的问题]]></title><link>https://blog.youkuaiyun.com/uestc_chenmo/article/details/78532060</link><guid>https://blog.youkuaiyun.com/uestc_chenmo/article/details/78532060</guid><author>uestc_chenmo</author><pubDate>Tue, 14 Nov 2017 16:36:32 +0800</pubDate><description><![CDATA[日常工程中经常用到遍历文件夹内所有文件或指定格式文件。 
因为主要都是做图像方面，OpenCV库接触较多，其中有实现遍历文件夹下所有文件的类Directory。 
Directory里面包括3个成员函数： 
(1)、GetListFiles：遍历指定文件夹下的所有文件，不包括指定文件夹内的文件夹； 
(2)、GetListFolders：遍历指定文件夹下的所有文件夹，不包括指定文件夹下的文件； 
(]]></description><category></category></item><item><title><![CDATA[C++基础系列：输入输出流条件状态问题]]></title><link>https://blog.youkuaiyun.com/uestc_chenmo/article/details/78478856</link><guid>https://blog.youkuaiyun.com/uestc_chenmo/article/details/78478856</guid><author>uestc_chenmo</author><pubDate>Wed, 08 Nov 2017 14:57:24 +0800</pubDate><description><![CDATA[写入若干个数据，再进行后续操作:string str[100];
int pair_length = 0;
while (getline(cin, str[pair_length])
    ++pair_length;
do_something();
int A;
cin >> A;
do_sth_else();想要读入未知数个数据，可以使用while循环来实现，在输入文件结束符（EOF，end-]]></description><category></category></item><item><title><![CDATA[C++基础系列：解引用与递增运算符*与++问题]]></title><link>https://blog.youkuaiyun.com/uestc_chenmo/article/details/78466939</link><guid>https://blog.youkuaiyun.com/uestc_chenmo/article/details/78466939</guid><author>uestc_chenmo</author><pubDate>Tue, 07 Nov 2017 13:21:09 +0800</pubDate><description><![CDATA[解引用和递增运算符复合表达式是一种很常见的表达，特别是在很多迭代器的使用时，不仅需要返回引用值还需要访问下一个元素，这类复合表达式往往不太能直观理解。 
直接举例说明：class test3
{
public:
    void main3()
    {
        int a[2] = { 10, 20 };
        int *p1, *p2, *p3,*p4;
        p1]]></description><category></category></item><item><title><![CDATA[C++基础系列：指针移动后delete问题]]></title><link>https://blog.youkuaiyun.com/uestc_chenmo/article/details/78461530</link><guid>https://blog.youkuaiyun.com/uestc_chenmo/article/details/78461530</guid><author>uestc_chenmo</author><pubDate>Mon, 06 Nov 2017 20:30:15 +0800</pubDate><description><![CDATA[实现去掉字符串中空格的功能。 
其间发现值得注意的几点： 
！！以下为错误代码！！class test4
{
public:
    int main4()
    {
        const char *inbuf = "  a string with space   !     ";
        char *outbuf = new char[50];        if (inbuf]]></description><category></category></item></channel></rss>