摘要:基础类1、 Dinkumware C++ Library参考站点:http://www.dinkumware.comP.J. Plauger编写的高品质的标准库。P.J. Plauger博士是Dr. Dobb's程序设计杰出奖的获得者。其编写的库长期被Microsoft采用,并且最近Borland也取得了其OEM的license,在其C/C+ +的产品中采用Dinkumware的库。2、 RogueWave Standard C++ Library参考站点:http://www.roguewave.com这个库在Borland C++ Builder的早期版本中曾经被采用,后来被其他的
阅读全文
随笔分类 - C/C++
摘要:STL好用是好用, 不慎的话相当危险, 尤其是俺们这些服务器程序. 迭代器失效就不说了, 发生了就是个当机回档的事, 慎之! 最近工作中看到了stl::sort排序导致的一个core, 问题的根源就是, stl::sort要求被排序的对象必须是顺序确定的, 比如你在重载<操作符的时候class Test1 { int a; bool operator < (const Test1& rhs) { return this->a < rhs.a; } }; 上面的代码就是没问题的, 因为两个给定的Test1对象, 调用<的时候的结果是一致的.但是如果是下面这.
阅读全文
摘要:在我开始设计系统的时候,我会花去很多时间去设计命名,因为好的命名和好的设计是分不开的。In the beginning was theWord, and the Word was with God, and the Word was God太初有道。道与神同在,道就是神。 (约翰福音第一章,第一节)在设计过程中给类,方法和函数好的命名会带来好的设计,虽然这不是一定成立,但是如果坏的命名那一定不会给你带来好的设计。在设计过程,如果你发现你很难命名某一个模块,某个方法时,可能你真正遇到的问题不是难命名的问题,而是这个设计是否真的合理,你或许应该花更多的时间来重新设计一下你的模块。好的命名不仅会带来
阅读全文
摘要:前几天Neo写过《编程中的命名设计那点事》,这里也有另外一篇和程序命名的文章,可以从另一个角度看看。1.- 变量应该是尽可能的望文知意好的变量:daysDateRange, flightNumber, carColor.坏的变量:days, dRange, temp, data, aux…在我们的日常工作中,有很大数量的开发人员喜欢使用短的变量名,而不是有含义的变量名。这主要是因为我们大学教科书的那些示例所造成的,人都是先入为主,所以,教科书中的那些很抽象,带着演示的变量命名影响了我们一代又一代的程序员,并影响了他们很多年。虽然那些短的,教材式的变量名,可能会让你少打一些字,但其实,这是非常非
阅读全文
摘要:选择一个正确的名字是编程中最重要的事。以前酷壳向大家推荐过两篇文章《编程命名中的7+1个提示》和《编程中的命名设计那点事》,今天再向大家推荐一篇。一个正确的命名可以让你更容易地理解代码的程序,好的命名可以消除二义性,消除误解,并且说明真实的意图,甚至可以让你有清新的气息以让你更能吸引异性。;-)方法,类和变量正确的名字可以让你的程序顾名思义,下面是一些提示:不要使用”ProcessData()“这样的命名你如果在你的程序生涯中使用这样的函数名,那么这意味着你将是一个不合格的程序员而会被淘汰或解雇。请明确实际的功能。比如:ValidateUserLogin(验证用户登录)或EliminateDu
阅读全文
摘要:异常不可用于逻辑处理异常是错误处理,但是不可以用于逻辑处理,假设我们封装了一个MsgQueue,这个类负责收集由服务端一条接受线程收集客户端消息,另一条工作线程负责取出消息,并对消息进行处理。class Msg {...};class MsgQueue { public: void put(Msg msg) throw (std::length_error); Msg get() throw (std::out_of_range); .....}这里定义了MsgQueue的两个方式,分别是收集客户端消息,然后保存消息的put方法,还有处理客户端消息,取...
阅读全文
摘要:前言 原文翻译自http://www.cplusplus.com/doc/tutorial/typecasting/,觉得这篇文章讲C++类型转换简单明了,所以特别翻译了下。 在C++中,将一个已知的类型转换为另一个类型,我们称呼为类型转换,本文会介绍C++的各种类型转换。隐式转换隐式转换不需要任何操作符,它们会自动执行,当值被赋值到兼容类型,就会执行,例如:short a=2000;int b;b=a;隐式转换,也包括构造函数和运算符的转换,例如:class A {};class B { public: B (A a) {} };A a;B b=a;显式转换C++是一个强类型的语言。许多..
阅读全文
摘要:前言TinyXML是一个开源的解析XML的解析库,能够用于C++,能够在Windows或Linux中编译,使用TinyXML进行C++ XML解析,使用简单,容易上手。这个解析库的模型通过解析XML文件,然后在内存中生成DOM模型,从而让我们很方便的遍历这棵XML树。 DOM模型即文档对象模型,是将整个文档分成多个元素(如书、章、节、段等),并利用树型结构表示这些元素之间的顺序关系以及嵌套包含关系。TinyXML介绍在TinyXML中,根据XML的各种元素来定义了一些类: TiXmlBase:整个TinyXML模型的基类。 TiXmlAttribute:对应于XML中的元素的属性。 TiXml
阅读全文
摘要:虽然一些C++第三库已经继承了MD5操作,但是有时我们更需要一个轻量的md5库函数,这里提供了一个MD5类,可以传入一个字符串生成md5结果。md5库下载下载解压后,有md5.h md5.cpp main.cpp三个文件,其中md5.h和md5.cpp是MD5类的头文件和实现文件,main.cpp是测试文件。编译和运行g++ md5.cpp main.cpp -o main./main输出结果:abc md5 is 900150983cd24fb0d6963f7d28e17f72其中main.cpp文件内容,也是MD5类的使用示例,如下:#include "md5.h"#i
阅读全文
摘要:前言JSON是一个轻量级的数据定义格式,比起XML易学易用,而扩展功能不比XML差多少,用之进行数据交换是一个很好的选择JSON的全称为:JavaScript Object Notation ,顾名思义,JSON是用于标记javascript对象的,详情参考http://www.json.org/。本文选择第三方库JsonCpp来解析json,JsonCpp是比较出名的c++解析库,在json官网也是首推的。JsonCpp简介JsonCpp主要包含三种类型的class:Value Reader Writer。jsoncpp中所有对象、类名都在namespace json中,包含json.h即可
阅读全文
摘要:初始化和赋值// constructing maps#include <iostream>#include <map>using namespace std;bool fncomp (char lhs, char rhs) {return lhs<rhs;}struct classcomp { bool operator() (const char& lhs, const char& rhs) const {return lhs<rhs;}};int main (){ map<char,int> first; first['
阅读全文
摘要:初始化和赋值// constructing vectors#include <iostream>#include <vector>using namespace std;int main (){ unsigned int i; // constructors used in the same order as described above: vector<int> first; // empty vector of ints vector<int> second (4,100); ...
阅读全文
摘要:1.连续内存序列容器(vector,string,deque)序列容器的erase方法返回值是指向紧接在被删除元素之后的元素的有效迭代器,可以根据这个返回值来安全删除元素。vector<int> c;for(vector<int>::iterator it = c.begin(); it != c.end();){if(need_delete())it = c.erase(it);else++it;}2.关联容器(set,multiset,map,multimap)关联容器的erase方法没有返回值,被删除的迭代器失效,所以删除前必须确保能得到下一个迭代器,可以用“后置
阅读全文
摘要:初始化和赋值// string constructor#include <iostream>#include <string>using namespace std;int main (){ string s0 ("Initial string"); // constructors used in the same order as described above: string s1; string s2 (s0); string s3 (s0, 8, 3); string s4 ("A character sequence",
阅读全文
摘要:引言C++ STL可以分为标准容器,算法和函数对象,迭代器和分配器,利用C++标准程序库,可以大量减少我们的代码,提高代码的稳定性和健壮性。标准容器C++标准容器分为序列容器和关联容器,对于序列容器,C++提供的基本序列有vector 支持随机访问,不适合做插入和删除操作频繁的场景list 双向链表,适合做元素的插入和删除,不是随机访问deque 也是一个双端序列,但是经过优化,其双端操作效率类似list,随即访问效率接近vector。从它们出发,通过定义适当的借口,生成了stack 默认用deque实现queue 默认是deque实现priority_queue 默认是vector保存元素,
阅读全文
摘要:前言虚函数是在类中被声明为virtual的成员函数,当编译器看到通过指针或引用调用此类函数时,对其执行晚绑定,即通过指针(或引用)指向的类的类型信息来决定该函数是哪个类的。通常此类指针或引用都声明为基类的,它可以指向基类或派生类的对象。通过类继承和虚函数机制可以实现C++运行期的动态多态。虚函数虚函数是动态多态性的基础,其调用的方式是动态联编(又称晚期联编,简单解释为只有在程序运行时才决定调用基类的还是子类的,系统会根据基类指针所指向的对象来决定要调用的函数)。非虚函数与其相反,是静态联编(调用已经在编译时期就决定了;在编译时期,系统已经根据指针所属的类型确定了要调用的函数)。在定义了虚函数后
阅读全文
摘要:简单继承继承是C++的特性,它可以创建一个类,继承一个已知的类,派生类自动拥有了基类的成员。继承的形式如下:class derived_class_name: public base_class_name{ /*...*/ };其中public表示继承方式,可以替代为protected和private,如果省略继承方式,对'class'将采用私有继承,对'struct'将采用公有继承。示例代码如下:// derived classes#include <iostream>using namespace std;class CPolygon { pro
阅读全文
摘要:引言typedef 声明,简称 typedef,为现有类型创建一个新的名字。比如人们常常使用 typedef 来编写更美观和可读的代码。所谓美观,意指 typedef 能隐藏笨拙的语法构造以及平台相关的数据类型,从而增强可移植性和以及未来的可维护性。 在编程中使用typedef目的一般有两个,一个是给变量一个易记且意义明确的新名字,另一个是简化一些比较复杂的类型声明。typedef的使用方法如下:typedef existing_type new_type_name ;注意:typedef 并不创建新的类型。它仅仅为现有类型添加一个同义字。typedef的最简单使用typedef int si
阅读全文
摘要:引言模板(Template)指C++程序设计设计语言中采用类型作为参数的程序设计,支持通用程序设计。C++ 的标准库提供许多有用的函数大多结合了模板的观念,如STL以及IO Stream。函数模板在c++入门中,很多人会接触swap(int&, int&)这样的函数类似代码如下:void swap(int&a , int& b) { int temp = a; a = b; b = temp;}但是如果是要支持long,string,自定义class的swap函数,代码和上述代码差不多,只是类型不同,这个时候就是我们定义swap的函数模板,就可以复用不同类型的s
阅读全文
摘要:引言异常,让一个函数可以在发现自己无法处理的错误时抛出一个异常,希望它的调用者可以直接或者间接处理这个问题。而传统错误处理技术,检查到一个局部无法处理的问题时:1.终止程序(例如atol,atoi,输入NULL,会产生段错误,导致程序异常退出,如果没有core文件,找问题的人一定会发疯)2.返回一个表示错误的值(很多系统函数都是这样,例如malloc,内存不足,分配失败,返回NULL指针)3.返回一个合法值,让程序处于某种非法的状态(最坑爹的东西,有些第三方库真会这样)4.调用一个预先准备好在出现"错误"的情况下用的函数。第一种情况是不允许的,无条件终止程序的库无法运用到不
阅读全文