随笔分类 - c++
摘要:bind好像不能绑定一个多态函数比如test()test(int)无论绑定任何一个都有问题下面的内容试过,但是没有效果:绑定一个被重载的函数的企图通常对导致一个错误,因为无法表示到底要绑定哪一个重载版本。对于带有 const 和非 const 两个重载的成员函数来说,这是一个很常见的问题,就像这个简化的示例:struct X{ int& get(); int const& get() const;};int main(){ boost::bind( &X::get, _1 );}这里的二义性可以通过将(成员)函数指针强制转换到想要的类型来解决:int main(){ b
阅读全文
摘要:转载自:http://blog.csdn.net/segen_jaa/article/details/8080167参考文章:http://www.cnblogs.com/TianFang/archive/2008/09/20/1294590.html。前言:C++中智能指针的引入,使得开发人员在与内存的斗争中占据上峰。然而凡事都不会尽善尽美,智能指针的循环引用缺陷还是会引发令人谈虎色变的内存泄露。本文的内容就是讲述,如何解决循环引用带来的内存问题。背景:智能指针采用Boost库,语言C++,开发工具VS2005,示例程序为Win32程序。关于Boost库的使用,可见另一篇文章http://b
阅读全文
摘要:1. 并不能在类的内部获得指向自己的智能指针(只能通过this指针获得指向自己的指针)
阅读全文
摘要:1: #include <list> 2: #include <string> 3: #include <functional> 4: #include <iostream> 5: 6: struct S { 7: std::string firstname; 8: std::string secondname; 9: int ID; 10: // 重新定义小于,因为默认的sort函数调用的操作符是<,所以我们只需要重载 < 就好了 11: ...
阅读全文
摘要:除了std::tr1::bind,另外有一个boost::bind,这个应该与boost中其他的数据结构结合的很紧。后者好像用的更多。(boost::function和boost::bind已经纳入了std::tr1,所以这两者应该是一样的)bind使用形式bind(&f)() 假设f是一个全局函数,绑定全局函数并调用bind (&A::f, A())() 假设A是一个构造函数为空的类,这个形式绑定了类的成员函数,故第二个参数需要传入一个成员。(成员静态函数除外)bind (&A::f, _1)(new A()) 同上,效果是一样的,但是使用了占位符,使得没有固定的的对
阅读全文
摘要:char *s[] = { "aaa", "bbb" }获得这个s的中包涵的字符串个数: sizeof(s)/sizof(s[0])
阅读全文
摘要:区别:1.引用不能指向空对象。 不存在指向空值的引用这个事实意味着使用引用的代码效率比使用指针的要高。因为在使用引用之前不需要测试它的合法性。2.应用的对象一旦初始化就不能改变。总结:1.当你知道你必须指向一个对象并且不想改变其指向时,或者在重载操作符并为防止不必要的语义误解时,你不应该使用指针。而在除此之外的其他情况下,则应使用指针。2.引用并不能完全消除指针。
阅读全文
摘要:多用组合,少用继承。组合:是通过对现有的对象进行拼装(组合)产生新的、更复杂的功能。也就是在一个类中直接使用另外一个类。继承:是类 D 的对象可以使用仅对类C的对象有效的方法或者属性的特性,它使得这些方法和属性就好像是由类 D 定义的。普通的继承语义。类应该对扩展开放,对修改关闭。具体有待丰富
阅读全文
摘要:转自http://www.cnblogs.com/flying_bat/archive/2008/01/18/1044693.html在C++中,有三种类型的循环语句:for, while, 和do...while, 但是在一般应用中作循环时, 我们可能用for和while要多一些,do...while相对不受重视。 但是,最近在读我们项目的代码时,却发现了do...while的一些十分聪明的用法,不是用来做循环,而是用作其他来提高代码的健壮性。1. do...while(0)消除goto语句。通常,如果在一个函数中开始要分配一些资源,然后在中途执行过程中如果遇到错误则退出函数,当然,退出前先
阅读全文
摘要:多读一些优秀的书籍,对于开发者稳固编程基础、提高编程技能有很大帮助。但是,大多时候,初学者不知道应该读什么书入门,有一定基础的开发者不知道如何进阶。本文总结了一个C++优秀书籍清单,希望能够为你带来一定的帮助。这些书大多数都有中文版,并且可以很容易在网上找到。阶段 1《Essential C++》这是一本内容不多但很实用的C++入门书籍,强调快速上手与理解C++编程。本书主要围绕一系列逐渐复杂的程序问题,以及用以解决这些问题的语言特性展开讲解。你不只学到C++的函数和结构,也会学习到它们的设计目的和基本原理。《C++ Primer》本书对C++基本概念、技术、以及现代C++编程风格进行了全面而
阅读全文
摘要:boost::scoped_ptr和std::auto_ptr非常类似,是一个简单的智能指针,它能够保证在离开作用域后对象被自动释放。下列代码演示了该指针的基本应用: #include <string>#include <iostream>#include <boost/scoped_ptr.hpp>class implementation{public:~implementation() { std::cout <<"destroying implementation/n"; }void do_something() { s
阅读全文
摘要:explicit如果A类有某个构造函数的单个输入参数,是B类(包括基本数据类型)的对象或引用,则C++的编译器会在需要A类形参的函数调用中,自动调用该构造函数,将B类实参隐式地转换为A类实参。这种自动类型转换的好处是,避免了定义函数的两个重载版本,代价是隐式调用构造函数会增加调用开销,并可能会带来其他问题。在标准C++中,新增加了关键字explicit(显式/清楚/明确),(只能)用在带单个参数的构造函数前,告诉编译器,不能使用该构造函数进行隐式类型转换。如果确实想转换,则必须采用显式的类型转换方式来进行。从而避免了可能出现的问题和额外的调用开销。例如:class One {……};class
阅读全文
摘要:简要的说,variant是有限定的变体类型(any是不限定的)。限定有限定的好处,variant是基于栈来储存值的,比起any用堆来要快得多;另外variant与STL的配合也容易得多。Boost.VariantVariant库包含一个不同于union的泛型类,用于在存储和操作来自于不同类型的对象。这个库的一个特点是支持类型安全的访问,减少了不同数据类型的类型转换代码的共同问题。Variant 库如何改进你的程序?对用户指定的多种类型的进行类型安全的存储和取回在标准库容器中存储不同类型的方法变量访问的编译期检查高效的、基于栈的变量存储
阅读全文
摘要:目前经常使用的平衡数据结构有:B树,红黑树,AVL树,Splay Tree, Treep等。(典型用处,关联数据,即,hash map 或者 字典)用跳表吧,跳表是一种随机化的数据结构,目前开源软件 Redis 和 LevelDB 都有用到它,它的效率和红黑树以及 AVL 树不相上下,但跳表的原理相当简单,只要你能熟练操作链表,就能轻松实现一个 SkipList。插入,搜寻元素的复杂度都为O(logn)-------------------------------------------------------------------------------------------------
阅读全文
摘要:https://github.com/facebook/folly/blob/master/folly/docs/Overview.md定位: 作为std和boost库的补充,高性能包括散列,向量,内存分配,位处理等部件: Arena.h ThreadCachedArena.h 内存管理的简单应用场景,多重分配一次被回收 AtomicHashMap.h AtomicHashArray.h 高性能的hash map,几乎没有用锁 Benchmark.h 测试代码的简单框架 Bits.h 高性能的一些位操作 ConcurrentSkipList.h 并发...
阅读全文
摘要:目前搜到几个版本:直接只用linux提供的接口:可以直接使用linux提供的接口函数,access判断存取权限,用stat获得文件长度然后读取相应文件使用c++提供的接口:ifstream,和istreambuf_iterator这两个函数ifstream,std::stringstream和rdbuf string m_InputFileName; //输入文件绝对路径 string m_InputData; //输入文件的内容 ifstream m_InputFile...
阅读全文
摘要:实例1:OBJ = a.o b.o main.oH = a.h b.hDBG = -gmain : $(OBJ) gcc $(OBJ) $(DBG) -o main%.o : %.cpp $(H) g++ -c $< -o $@实例2:作为Linux或Unix下的程序开发人员,大家一定都遇到过Makefile,用make命令来编译自己写的程序确实是很方便。一般开发情况下,大家都是手工写一个简单Makefile。下面先给一个最简单的示例代码:#makefile示例object= main.o function.ochange:$(object) cc -o change $(obje...
阅读全文
摘要:插入 InsertAttr(name, value)查询 EvaluateAttr*** 这么一系列的函数
阅读全文
摘要:对于某类查询接口,有两种方法:User Query(int user_id)int Query(User& user, int user_id)User* Query(int user_id)第一种的判断逻辑虽然复杂一些,但是不会出问题,第一种对于返回是否为空的时候不太好做。第二种,感觉不是那么美观。第三种,问题出在malloc 等一系列的操作,可能会造成内存泄漏。
阅读全文
摘要:今天发现一点,用thrift 写c++程序,当service 返回值不为 bool 和 int 的时候,框架会自己把返回值移入到参数中。比如string Match(1: string str_ad)会变成 void CollectorService::Match(string& result, const string& str_ad)对于java而言,任何都是应用,故不存在这个问题如果我想用的是继想有返回值,又想有参数的返回值,比如是这样的bool Query(1: MachineInfo &mi, 2: string endpoint) 好像就不行,参数所有变成c
阅读全文