随笔分类 -  c/c++

c++异常处理
摘要:通过异常处理,可以将问题的检测和问题的解决分离,这样程序的问题检测部分可以不必了解如何处理问题。由问题检测部分抛出一个异常对象给问题处理代码,通过这个对象的类型和内容,两个部分能够就出现了什么错误进行通信。Sales_item operator+(const Sales_item& lhs, const Sales_item& rhs){ if (!lhs.same_isbn(rhs))throw runtime_error(“Data must refer to same ISBN”); // ok, if we’re still here the ISBNs are the 阅读全文

posted @ 2012-12-20 12:00 zhuyf87 阅读(258) 评论(0) 推荐(0)

嵌套的命名空间和匿名的命名空间
摘要:1. 嵌套的命名空间命名空间可以嵌套,嵌套的命名空间可以进一步改进库中代码的组织。namespace cplusplus_primer { namespace QueryLib {class Query { /* … */ };// … } namespace Bookstore {class Item_base { /* … */ };// … }}当需要防止库中每个部分的名字与库中其他部分的名字冲突的时候,嵌套命名空间是很有用的。使用时,类Query的完全限定名如下:cplusplus_primer::QueryLib::Query。2. 匿名的命名空间匿名的命名空间可以在给定文件... 阅读全文

posted @ 2012-12-18 13:05 zhuyf87 阅读(4739) 评论(0) 推荐(0)

c++命名空间
摘要:命名空间(namespace)为防止名字冲突提供可控机制。一个命名空间是一个作用域,可以在命名空间内部定义自己的模板名、类型名、函数名,而不会与其它命名空间中的相同名字造成冲突。namespace cplusplus_primer {class SalesItem { /* … */ };SalesItem operator+(const SalesItem &, const SalesItem&);class Query {public: Query(const std::string&); std::ostream & display(std::ostrea 阅读全文

posted @ 2012-12-15 18:11 zhuyf87 阅读(1930) 评论(0) 推荐(0)

list使用要点
摘要:list使用一个doubly linked list(双向链表)管理元素,任何具备assignable和copyable两个性质的类型T,都可以作为list的元素。list的内部结构与vector和deque截然不同:1. 不支持随机存取。如果要存取第5个元素,就得顺着串链依次爬过前4个元素。所以list的遍历是很缓慢的行为。2. 任何位置上的插入和删除都非常快。3. 插入和删除操作不会造成指向其它元素的pointers、references、iterators失效。list包含很多成员函数,但由于不支持随机存取,所以不提供subscript(下标)操作符,也不提供at()。另外,list提供 阅读全文

posted @ 2012-12-13 16:34 zhuyf87 阅读(301) 评论(0) 推荐(0)

Pseudo-random sequence generation
摘要:randGenerate random number (function)srandInitialize random number generator (functions)c/c++产生随机数需要用到c库中的两个函数:srand和rand。srand函数用来设置随机数种子,初始化随机数生成器;rand函数用来产生随机数。两个函数的介绍和使用示例如下:srandfunctionvoid srand ( unsigned int seed );Initialize random number generatorThe pseudo-random number generator is init 阅读全文

posted @ 2012-12-12 07:58 zhuyf87 阅读(1623) 评论(0) 推荐(0)

私房STL之deque
摘要:原文地址:捣乱小子http://www.daoluan.net/一句话deque:deque是双端队列,它的空间构造并非一个vector式的长数组,而是“分段存储,整体维护”的方式;STL允许在deque中任意位置操作元素(删除添加)(这超出了deque的概念,最原始的deque将元素操作限定在队列两端),允许遍历,允许随机访问(这是假象);我们将看到,deque将是STL中stack和queue的幕后功臣,对deque做适当的修正,便可以实现stack和queue。deque的迭代器deque的迭代器与一般的迭代器不同,并不是vector或者list的普通指针式迭代器,有必要写下。..... 阅读全文

posted @ 2012-12-10 07:19 zhuyf87 阅读(585) 评论(0) 推荐(0)

deque与vector的主要区别
摘要:deque与vector非常相似。它也采用动态数组管理元素,提供随机存取,有着和vector几乎一样的接口。不同的是deque的动态数组头尾都开放,因此能在头尾两端进行快速安插和删除。deque通常实作为一组独立区块,第一区块朝某方向扩展,最后一个区块朝另一个方向扩展。deque与vector的主要不同之处在于:1. 两端都能快速安插和删除元素,这些操作可以在分期摊还的常数时间(amortized constant time)内完成。2. 元素的存取和迭代器的动作比vector稍慢。3. 迭代器需要在不同区块间跳转,所以它非一般指针。4. 因为deque使用不止一块内存(而vector必须使用 阅读全文

posted @ 2012-12-09 12:56 zhuyf87 阅读(15719) 评论(0) 推荐(4)

使用vector需要注意的要点
摘要:vector的元素类别T,必须具备assignable和copyable两个性质。vector的容量很重要:1. 一旦内存重新配置,和vector元素相关的所有references、pointers、iterators都会失效。2. 内存重新分配很耗时间。所以,如果程序管理了和vector元素相关的references、pointers、iterators或执行速度至关重要,就必须考虑容量问题。可以使用reserve()保留适当容量,避免一再重新分配内存。可以利用如下语句缩减容量:std::vector<T>(v).swap(v);c1 = c2:将c2的全部元素赋值给c1c.as 阅读全文

posted @ 2012-12-08 21:32 zhuyf87 阅读(1494) 评论(0) 推荐(0)

iterator迭代循环的风格问题
摘要:for (vector<int>::iterator i = v.begin(); i < v.end(); i++) { cout << *i << endl;}这个循环本身没有明显错误,存在的只是一些风格上的问题。(1)尽量做到const正确性。如果迭代器没有用来修改vector中的元素,应该改用const_iterator。(2)尽量使用“!=”而不是“<”来比较两个迭代器。因为“<”只对随机访问迭代器有效(例如,std::list的迭代器并不支持“<”),而“!=”对于任何迭代器都有效。所以应该把使用“!=”比较迭代器作为日常 阅读全文

posted @ 2012-12-08 08:51 zhuyf87 阅读(335) 评论(0) 推荐(0)

size resize与capacity reserve之间的区别
摘要:大小(size,跟resize相对应)与容量(capacity,与reserve相对应)之间有很大的区别:size表明容器中目前实际有多少个元素,resize会在容器的尾部添加或删除一些元素,使容器达到指定的大小。这两个函数对list、vector、deque都适用,对其它容器不适用。capacity表明最少添加多少个元素才会导致容器重新分配内存,reserve会使容器的内部缓冲区扩充至一个更大的容量,以确保至少满足reserve的参数所指出的空间大小。这两个函数仅对vector适用。v.reserve(2);执行之后,可以确保v.capacity() >= 2;(注意不是v.capac 阅读全文

posted @ 2012-12-07 12:39 zhuyf87 阅读(507) 评论(0) 推荐(0)

vector中v[i]与v.at(i)的区别
摘要:void f(vector<int> &v){ v[0]; // A v.at[0]; // B}如果v非空,A行和B行没有任何区别。如果v为空,B行会抛出std::out_of_range异常,A行的行为未定义。c++标准不要求vector<T>::operator[]进行下标越界检查,原因是为了效率,总是强制下标越界检查会增加程序的性能开销。设计vector是用来代替内置数组的,所以效率问题也应该考虑。不过使用operator[]就要自己承担越界风险了。如果需要下标越界检查,请使用at。 阅读全文

posted @ 2012-12-06 18:15 zhuyf87 阅读(13355) 评论(0) 推荐(1)

使用“swap技巧”除去多余的容量
摘要:为了避免vector占用不再需要的内存,需要有一种方法把它的容量(capacity)缩减到当前需要的数量。方法就是:vector<ElemType>(v).swap(v);。vector<ElemType>(v)创建一个临时变量,它是v的一个拷贝。vector的拷贝构造函数只为所拷贝的元素分配所需要的内存,所以这个临时变量不会有多余的容量。然后将这个临时变量与v做swap操作,在这之后v就具有了被去除之后的容量,即原先临时变量的容量。临时变量会具有原先v的容量,随后临时变量被析构,从而释放内存。测试程序及输出(vc2008):vector<int> v;v. 阅读全文

posted @ 2012-12-06 16:40 zhuyf87 阅读(702) 评论(0) 推荐(0)

如何把vector和string数据传递给旧的api
摘要:如果决定使用vector和string代替传统的数组,就要考虑如何与旧的C API和平共处。如果有一个vector v,同时需要一个指向v中数据的指针,从而把v中的数据当做数组来对待。可以使用&v[0]来得到这样的指针,&v[0]会指向v中的第一个元素,并且c++标准要求vector中的元素存储在连续的内存中,就像数组一样。void do_something(const int * ints, size_t num_ints);if (!v.empty()) do_something(&v[0], v.size());不要使用v.begin()来代替&v[0], 阅读全文

posted @ 2012-12-06 14:26 zhuyf87 阅读(718) 评论(0) 推荐(0)

使用reserve函数避免vector和string的内存重新分配
摘要:vector和string内部维护的内存会“自动增长”,以便容纳不断放入其中的元素。调用max_size()可以返回其容量的最大限制。“自动增长”的过程如下:(1)分配一块大小为当前容量的某个倍数的新内存。(2)将元素从旧内存拷贝到新内存。(3)析构旧内存中的对象。(4)释放旧内存。“自动增长”的过程很耗时,并且会导致所有的指针、迭代器和引用失效。所以避免频繁的内存重新分配就显得很重要。使用成员函数reserve()可以避免因“自动增长”而造成的内存重新分配。要尽早的使用reserve,把容量设为足够大。最好在容器刚被构造出来之后就使用reserve。vector<int> v;v 阅读全文

posted @ 2012-12-06 10:28 zhuyf87 阅读(628) 评论(0) 推荐(1)

用vector和string代替new动态分配的数组
摘要:使用new动态分配数组,需要时时刻刻记住delete,很容易造成memory leak。使用vector和string则消除了这个负担,因为它们有自己的内存管理,在它们的析构函数中会自动释放内存。通常情况下用vector代替动态数组,如果要存储的元素类型是字符类型时使用string。所有适合于序列容器的STL算法,vector和string都可以使用。所以使用vector和string会带来更多的便利。许多string的实现采用了“引用计数”,用于消除不必要的内存分配和不必要的字符拷贝。但这样的实现在多线程环境中,需要注意一下因支持线程安全而导致的性能问题。如果所使用的string以“引用计数 阅读全文

posted @ 2012-12-05 18:32 zhuyf87 阅读(1893) 评论(0) 推荐(0)

我将采用的 C++编码规范(1)——命名约定
摘要:公司成立不久,暂时没有完备的项目编码规范。自己现在的工作也基本上是独立完成,没有团队合作。所以这里的命名约定作为自己的“单兵装备”,尽量约束自己写出风格统一、清晰易读的代码。本约定几乎完全参考“Google C++ Style”,部分参考“QT”。所采用的命名风格可以直接确定命名实体是:类型、变量、函数、常量、宏等等,而无需查找实体声明。(1)通用命名规则1. 尽可能不使用缩写,即便是那些显而易见的缩写(如:num -> number)。2. 类型和变量名一般为名词,如:FileOpener、number_errors。3. 函数名通常是指令性的,如OpenFile()。(2)文件命名1 阅读全文

posted @ 2012-11-08 18:16 zhuyf87 阅读(910) 评论(0) 推荐(0)

设计Qt风格的C++API
摘要:原文地址:http://doc.qt.digia.com/qq/qq13-apis.html在奇趣(Trolltech),为了改进Qt的开发体验,我们做了大量的研究。这篇文章里,我打算分享一些我们的发现,以及一些我们在设计Qt4时用到的原则,并且展示如何把这些原则应用到你的代码里。优秀API的六个特性便利陷阱布尔参数陷阱静态多态命名的艺术指针还是引用?案例分析:QProgressBar如何把API设计好设计应用程序接口(APIs)是有难度的,这是一门和设计语言同样难的艺术。要遵循许多不同的原则,这些原则中的许多还彼此冲突。现在,计算机科学教育把很大的力气放在算法和数据结构上,而很少关注设计语言 阅读全文

posted @ 2012-11-07 07:38 zhuyf87 阅读(3295) 评论(0) 推荐(1)

C/C++ 语言中表达式的求值
摘要:作者:裘宗燕 北京大学数学学院信息科学系 本文基本内容发表于《编程高手》杂志 2004 年第 12 期经常可以在一些讨论组里看到下面的提问:“谁知道下面 C 语句给 n 赋什么值?” m = 1; n = m+++m++; 最近有位不相识的朋友发 email 给我,问为什么在某个 C++系统里,下面表达式打印出两个4,而不是 4 和 5: a = 4; cout << a++ << a; C++ 不是规定 << 操作左结合吗?是 C++ 书上写错了,还是这个系统的实现有问题?要弄清这些,需要理解的一个问题是:如果程序里某处修改了一个变量(通过赋值、增量/减量 阅读全文

posted @ 2012-10-18 16:56 zhuyf87 阅读(1457) 评论(0) 推荐(0)

导航