摘要: capacity - 容器的成员函数capacity()取得max_size - 容器的成员函数max_size()取得STL容器的capacity属性,表示STL在发生realloc前能允许的最大元素数,也可以理解为预分配的内存空间。例如一个vector<int> v的capacity为5,当插入第6个元素时,vector会realloc,vector内部数据会复制到另外一个内存区域。这样之前指向vector中的元素的指针、迭代器等等均会失效。max_size属性和capacity不同,表示STL容器允许的最大元素数,通常,这个数是一个很大的常整数,可以理解为无穷大。这个数目与平 阅读全文
posted @ 2012-05-30 18:57 斯啦丝拉 阅读(7957) 评论(0) 推荐(0) 编辑
摘要: 线程的私有存储空间包括:栈(一般情况下是私有的)线程局部存储(部分操作系统提供)寄存器(包括PC寄存器)从C程序员的角度来看:线程私有:局部变量函数的参数线程局部存储数据线程之间共享:全局变量堆上的数据函数里的静态变量程序代码打开的文件(统一进程下,A线程打开的文件,可以由B线程读写) 阅读全文
posted @ 2012-05-27 11:33 斯啦丝拉 阅读(184) 评论(0) 推荐(0) 编辑
摘要: 左值(LValue)和右值(RValue)的一个快捷记法是赋值运算,左值是赋值运算左边的值,右值就是右边(=,=废话)。例如:int a = 5;a就是左值,5就是右值。当然,如果真是这么个含义,那么这概念就相当蛋疼了。其实不是这样的~~左值其实是对一块内存区域的引用(这个还不是C++中的int &a之类的引用),比如上边的a,就对应了一块内存区域(起始地址为&a,大小为sizeof(int))。更专业的定义在这里:An object is a region of storage that can be examined and stored into. An lvalue i 阅读全文
posted @ 2012-05-12 23:37 斯啦丝拉 阅读(376) 评论(0) 推荐(0) 编辑
摘要: 现在,C++有如下智能指针,除了auto_ptr外,其他都是11标准引入的。所有的智能指针都是模板化(class template)的。so,可以使用xxxx_ptr<T>的形式来满足不同的数据类型。unique_ptrsmart pointer with unique object ownership semantics只能有一个主人的指针,可以用于STL容器shared_ptrsmart pointer with shared object ownership semantics可共享的指针weak_ptrweak reference to an object managed 阅读全文
posted @ 2012-04-27 13:19 斯啦丝拉 阅读(5176) 评论(0) 推荐(0) 编辑
摘要: operaotr除了用于重载=、>、<之类的东西外,还有以下用途1. 类型转换class T{public: operator int() const { return 5; }};上述的代码,为T类提供了转换为int的能力。默认隐式使用。注意使用了const,保证可靠性。T t = T();int i = t;cout << i << endl; // 输出52. 赋值运算重载class T{ public: int _val; T(int val): _val(val){} void operator=(const T& t) ... 阅读全文
posted @ 2012-04-24 18:14 斯啦丝拉 阅读(308) 评论(0) 推荐(0) 编辑
摘要: transaction safe即commit-or-rollback,在数据库里很常见。如果一个操作是事务安全的,即表示:在执行操作时发生意外导致操作没有完成,该操作所有已经完成的修改均会自动撤销。在C++中,上文所述的“意外”是指异常,如果一个操作不会抛出异常,那么它是永远“成功执行”的(设计者这么看,使用不当会发生不可预期后果),这样的操作不涉及事务安全。STL在guarantee和性能之间更倾向于后者,不完全保证事务安全。STL容器分为两类node-based: 以指针连接各节点。 有以下容器:list, set, multiset, map, multimap 不涉及事务安全:销.. 阅读全文
posted @ 2012-04-23 11:20 斯啦丝拉 阅读(962) 评论(0) 推荐(0) 编辑
摘要: 这个算法比较全面了,复杂度比较低。没有使用SB的递归,转而使用递减的除数来判定。bool isPrime(int number) { //ignore negative sign number = abs(number); // 0 and 1 are prime numbers if (number == 0 || number == 1) { return true; } //find divisor that divides without a remainder int divisor; for (divisor = num... 阅读全文
posted @ 2012-04-19 18:24 斯啦丝拉 阅读(285) 评论(0) 推荐(0) 编辑
摘要: 我主要是想使用单元测试,VS2010是有自己的单元测试的,虽然我不抵触Microsoft的东西,但是自己做的非工业级的东西,去用Microsoft的解决方案是找罪受~所以使用了Google的测试方案。主要查阅了国外的一篇资料,虽然那位写得实在简略,但写得还是不错的,我补充梳理了一下。下载部署GTest首先去下载Google Test,网址为http://code.google.com/p/googletest/。我写此文的时候是1.6版。解压之,因为要反复使用,所以最好放到固定的目录。我解压到了D:\Selah\VSProjects\Source下。打开解压后的目录,结构如下:其中要接触的目录 阅读全文
posted @ 2012-04-11 16:03 斯啦丝拉 阅读(7852) 评论(1) 推荐(0) 编辑
摘要: 最好不要将对象设为static duration的(静态的、全局的),这样的话,对象的初始化顺序以及销毁顺序均不可控,多线程时可能出现问题。构造函数:构造函数可能会调用内部函数,如果这个函数是虚函数,可能出现问题(其实也不是啥问题,如果熟悉派生类的构造过程的话)。详见下例:构造函数不会重载virtual#include <iostream>using std::cout;using std::endl;class Base{public: virtual void Foo(){ cout << "执行了Base的Foo()函数" << e 阅读全文
posted @ 2012-04-09 20:48 斯啦丝拉 阅读(435) 评论(0) 推荐(0) 编辑
摘要: static用于声明全局变量(包括类的对象),局部变量,全局函数,类的成员变量和成员函数。即,static不能用于类、结构、枚举、联合的声明。static有如下用途:①使变量具有初值:静态变量具有初值。局部变量是没有初值,而static的局部变量将有初值。全局变量本身就具有初始值,所以static不发生作用。static用于全局变量,更多是用于解决命名冲突问题。static确定初始值#include <iostream>void PrintNormal(){ int i; double d; char c; int* p; std::cout << a << 阅读全文
posted @ 2012-04-09 11:28 斯啦丝拉 阅读(2553) 评论(0) 推荐(1) 编辑