随笔分类 -  C/C++

摘要:写了一个很简单的测试数据库连接的程序conn.c如下:#include <stdio.h>#include <stdlib.h>#include "/usr/local/mysql/include/mysql/mysql.h"#include <string.h>int main(int argc, char *argv[]){MYSQL my_connection;mysql_init(&my_connection);if (mysql_real_connect(&my_connection, "localho 阅读全文
posted @ 2013-04-06 22:47 瑞尼书苑 阅读(7399) 评论(0) 推荐(0)
摘要:[合集] 请问boost中的enable_shared_from_this类问题http://www.btsmth.com/show_snapshot.php?en_name=CPlusPlus&gid=314844楼主hma(If you think you can, you can.)☆─────────────────────────────────────☆ panrainbow (忧郁淡蓝) 于 (Tue Nov 9 11:48:38 2010) 提到:引入enable_shared_from_this的原因是可以实现返回值为指向该类本身的shared_ptr,为什么以thi 阅读全文
posted @ 2013-03-31 19:14 瑞尼书苑 阅读(1018) 评论(0) 推荐(0)
摘要:shared_from_this()是enable_shared_from_this<T>的成员 函数,返回shared_ptr<T>。首先需要注意的是,这个函数仅在shared_ptr<T>的构造函数被调用之后才能使 用。原因是enable_shared_from_this::weak_ptr并不在构造函数中设置,而是在shared_ptr<T>的 构造函数中设置。如下代码是错误的:class D:publicboost::enable_shared_from_this<D>{public: D() { boost::shared_ 阅读全文
posted @ 2013-03-31 19:08 瑞尼书苑 阅读(246) 评论(0) 推荐(0)
摘要:目前,我们常用的配置文件格式有XML和ini, XML层次分明,但其缺点就是写起来太繁杂,对一些关键字如<>之类的处理比较特殊。而ini呢,配置不够灵活,只有简单的段-键-值模式,对于一些多层结构的配置,或者一些列表类型的配置,就显得力不从心了,往往需要编码人员自己分割字符串。 Lua脚本非常简洁清晰,是非常适合做配置文件的,无论是映射表型配置,还是列表型配置,还是简单的键值配置,lua都可以完全胜任。而且lua格式清新简洁,一看就懂。 所以,用lua作为程序的配置文件是非常明智的,但是,在C++中解释lua脚本的配置文件,仅仅通过lua提供的原始API,就显得非常吃力了,所以我封 阅读全文
posted @ 2012-11-22 22:16 瑞尼书苑 阅读(428) 评论(0) 推荐(0)
摘要:类所占内存的大小是由成员变量(静态变量除外)决定的,成员函数(这是笼统的说,后面会细说)是不计算在内的。摘抄部分:成员函数还是以一般的函数一样的存在。a.fun()是通过fun(a.this)来调用的。所谓成员函数只是在名义上是类里的。其实成员函数的大小不在类的对象里面,同一个类的多个对象共享函数代码。而我们访问类的成员函数是通过类里面的一个指针实现,而这个指针指向的是一个table,table里面记录的各个成员函数的地址(当然不同的编译可能略有不同的实现)。所以我们访问成员函数是间接获得地址的。所以这样也就增加了一定的时间开销,这也就是为什么我们提倡把一些简短的,调用频率高的函数声明为inl 阅读全文
posted @ 2012-10-15 15:11 瑞尼书苑 阅读(190) 评论(0) 推荐(0)
摘要:#include <iostream>#include <boost/regex.hpp> using namespace std; int main(){ boost::regex reg("\\{([\\w]+)\\}"); std::string s="{afd}lookki{vvvv}kjkj{ddd}{ssss}{fddda}"; boost::sregex_iterator end; for (boost::sregex_iterator it(s.begin(),s.end(),reg); it != end; it 阅读全文
posted @ 2012-10-12 11:29 瑞尼书苑 阅读(223) 评论(0) 推荐(0)
摘要:#include<string>std::stringws2s(conststd::wstring&ws){std::stringcurLocale=setlocale(LC_ALL,NULL);//curLocale="C";setlocale(LC_ALL,"chs");constwchar_t*_Source=ws.c_str();size_t_Dsize=2*ws.size()+1;char*_Dest=newchar[_Dsize];memset(_Dest,0,_Dsize);wcstombs(_Dest,_Source, 阅读全文
posted @ 2012-10-12 11:24 瑞尼书苑 阅读(1198) 评论(0) 推荐(0)
摘要:http://dozb.bokee.com/1976532.html模板类:lbasic_regex 用来保存一个“正则表达式”的类。lsub_match 继承于pair<Iterator,Iterator>迭代器组,用来表示匹配的一个结果。lmatch_results sub_match的容器,用来表示一次搜索或匹配算法的所有结果,类似于vector<sub_match>。算法:lregex_math匹配算法,测试一个字符串是否和一个正则式匹配,并通过match_results返回结果。lregex_find 查找算法,查找字符串的一个和正则式匹配的字串,并通过mat 阅读全文
posted @ 2012-10-11 17:25 瑞尼书苑 阅读(642) 评论(0) 推荐(0)
摘要:C++ 使用正则表达式分割字符串#include <iostream>#include <string>#include <boost/regex.hpp>int main(){ std::string s = "who,lives:in-a,pineapple under the sea?"; boost::regex re(",|:|-|\\s+"); boost::sregex_token_iterator p(s.begin(),s.end(),re,-1); boost::sregex_token_itera 阅读全文
posted @ 2012-10-11 17:19 瑞尼书苑 阅读(4219) 评论(0) 推荐(0)
摘要:为了能够让用户更清晰的写采集规则,特意把采集回来的源码经过精简之后再进行处理,比如,要删除 <style> </style> <script> </script>注释等内容去除标签垃圾属性等,使用正则表达式,大一点的网页数据,匹配替换为空一次竟然可以达到几百毫秒,吓死人,故自己写了个函数,同样的数据大小1-3毫秒完成.Cpp代码<span><spanstyle="color:#000000;">//------这上面几段垃圾html代码删不掉了,请无视它,自动跑进去的classBaseLib{publi 阅读全文
posted @ 2012-10-11 16:40 瑞尼书苑 阅读(841) 评论(0) 推荐(0)
摘要:shared_ptr很好地消除了显式的delete调用,如果读者掌握了它的用法,可以肯定delete将会在你的编程字典中彻底消失 。但这还不够,因为shared_ptr的构造还需要new调用,这导致了代码中的某种不对称性。虽然shared_ptr很好地包装了new表达式,但过多的显式new操作符也是个问题,它应该使用工厂模式来解决。因此,shared_ptr在头文件<boost/make_shared.hpp> 中提供了一个自由工厂函数(位于boost名字空间)make_shared<T>(),来消除显式的new调用,它的名字模仿了标准库的 make_pair(),声明 阅读全文
posted @ 2012-09-29 14:21 瑞尼书苑 阅读(5200) 评论(0) 推荐(0)
摘要:按照默认规定,只有一个参数的构造函数也定义了一个隐式转换,将该构造函数对应数据类型的数据转换为该类对象,如下面所示:class String {String ( const char* p );//用C风格的字符串p作为初始化值//…}String s1 = “hello”;//OK 隐式转换,等价于String s1 = String(“hello”);但是有的时候可能会不需要这种隐式转换,如下:class String { String ( int n );//本意是预先分配n个字节给字符串String ( const char* p );//用C风格的字符串p作为初始化值//…}下面两种 阅读全文
posted @ 2012-09-29 14:11 瑞尼书苑 阅读(206) 评论(0) 推荐(0)
摘要:1. 获取时间戳:time_t rawtime;time(&rawtime); //结果是时间戳2. 将时间戳转为 char* 类型的日期Www Mmm dd hh:mm:ss yyyy 1 /* ctime example */ 2 #include <stdio.h> 3 #include <time.h> 4 #include <iostream> 5 6 using namespace std; 7 8 int main () 9 {10 time_t rawtime;11 12 time ( &rawtime );13 printf 阅读全文
posted @ 2012-09-29 11:54 瑞尼书苑 阅读(8045) 评论(0) 推荐(0)
摘要:有时候经常要实现程序在某个时间段进行某些操作的功能,如果利用boost库的话可以很方便就能实现。[cpp] #include<boost/date_time/posix_time/posix_time.hpp> #include<boost/date_time/gregorian/gregorian.hpp> //首先要定义一个时间区间段,设程序需在每日的8:50~9:15之间实现某些操作; boost::posix_time::time_period*pTimePeriod=NULL; boost::posix_time::ptimept(b... 阅读全文
posted @ 2012-09-28 17:38 瑞尼书苑 阅读(696) 评论(0) 推荐(0)
摘要:可以设置函数属性(Function Attribute), 变量属性(Variable Attribute), 类型屬性(Type Attribute)语法: __attribute__ (parameter) 注: attribute 前后各有两个下划线(underscore) 后面紧跟小括号((bracket)), 括号中间为__attribute__参数.其位置一般于声明的尾部; 以前函数属性(Function Attribute) 函数属性可以帮助开发者把一些特性添加到函数声明中,从而可以使编译器在错误检查方面的功能更强 大。__attribute__机制也很容易同非GNU应用程序做到 阅读全文
posted @ 2012-09-27 16:59 瑞尼书苑 阅读(164) 评论(0) 推荐(0)
摘要:#include <string>//使用C++标准库的string类时using namespace std;//同上#include <sstream>#include <iostream>#include <stdlib.h>//要将string类和int类型直接转换最好有这些包含,//因为自己写一个转换函数比较方便,函数定义参考如下string getstring ( const int n ){std::stringstream newstr;newstr<<n;return newstr.str();}////////// 阅读全文
posted @ 2012-09-27 14:19 瑞尼书苑 阅读(226) 评论(0) 推荐(0)
摘要:在编写多线程程序时,多个线程同时访问某个共享资源,会导致同步的问题,这篇文章中我们将介绍C++11 多线程编程中的数据保护。数据丢失让我们从一个简单的例子开始,请看如下代码:01#include <iostream>02#include <string>03#include <thread>04#include <vector>0506usingstd::thread;07usingstd::vector;08usingstd::cout;09usingstd::endl;1011classIncrementer12{13private:14in 阅读全文
posted @ 2012-08-29 10:56 瑞尼书苑 阅读(277) 评论(0) 推荐(0)
摘要:引子1 猜猜看,下面这段代码有什么问题: void Delay(UINT32 n) { while(—n); } 答案: 本来代码完全正常,但是为了优化性能,打开了编译器的优化。但是发现这个函数被编译器优化掉了。为了防止被优化掉,需要给函数的参数加上volatile: void Delay(volatile UINT32 n) { while(—n); } 引子2 再猜猜看,这段代码有什么问题: int square(volatile int *ptr) { return *ptr * *ptr; } 答案: 由于*ptr指向一个volatile型参数,编译器将产生类... 阅读全文
posted @ 2012-08-29 10:40 瑞尼书苑 阅读(188) 评论(0) 推荐(0)
摘要:try{} catch(…){}以前都是用try{} catch(…){}来捕获C++中一些意想不到的异常,今天看了Winhack的帖子才知道,这种方法在VC中其实是靠不住的。例如下面的代码:try{BYTE* pch ;pch = ( BYTE* )00001234 ;//给予一个非法地址*pch = 6 ; //对非法地址赋值,会造成Access Violation 异常}catch(...){AfxMessageBox( "catched" ) ;}这段代码在debug下没有问题,异常会被捕获,会弹出”catched”的消息框。但在Release方式下如果选择了编译器 阅读全文
posted @ 2012-08-28 14:07 瑞尼书苑 阅读(975) 评论(0) 推荐(0)
摘要:unix时间相关,也是在标准库里面的。 1.timegm函数只是将struct tm结构转成time_t结构,不使用时区信息 time_t timegm(struct tm *tm); 2.mktime使用时区信息 time_t mktime(struct tm *tm); timelocal 函数是GNU扩展的与posix函数mktime相当 time_t timelocal (struct tm *tm); 3.gmtime函数只是将time_t结构转成struct tm结构,不使用时区信息 struct tm * gmtime(const time_t *clock); ... 阅读全文
posted @ 2012-08-14 11:22 瑞尼书苑 阅读(1616) 评论(0) 推荐(0)