1、c++ 标准程序库中的所有标识符都定义于一个名为std的namespace。
2、标准异常类别
c++语言本身或标准程序库所抛出的异常,都派生自基类exception。这些标准异常类别分为三类:
(1)语言本身支持的异常
(2)c++标准程序库所发出的异常
(3)程序作用域之外所发出的异常
如果一个函数有可能抛出异常,则在函数外进行声明,如果函数中抛出了未经声明的异常,则会引发unexcepted异常。
如果在异常规格列表中列出了 bad_exception, 则任何函数中抛出的未列出的异常,都将在函数unexpected()被代之以 bad_exception.
3、auto_ptr 起点和终点.
auto_ptr进行拷贝构造或者= 赋值时,更新后的auto_ptr 拥有实际的指针索引,旧的auto_ptr 变为 null。
拥有权的转移,使得auto_ptr产生了另外的用法:一个函数可以利用auto_ptr 将拥有权转交给另外一个函数:
如果一个对象通过auto_ptr进行传递,就可以使用常数型auto_ptr来终结拥有权移转链,此后拥有权就不能再进行更改。例如,不能将常数型的auto_ptr作为值参数传递给函数。(因为如果通过值传递给函数,则auto_ptr的所有权发生改变)
4、const iterator 和 const_iterator
const iterator类似于原生指针T * const p这样的类型,即iterator本身的值是不可以修改的,但是你可以修改它所指向的目标。const_iterator类似于原生指针T const * p这样的类型,即iterator本身的值是可变的,但是它所指向的目标是只读的。
5、++ iterator 的效率要高于 iterator ++
因为 iterator ++ 需要一个额外的临时对象,因为它必须存放迭代器的原始位置并将它返回。
6、可以在STL中使用自定义的函数,但要注意一般需要使用泛型
inline void PRINT_ELEMENT(const T& col, const char* optcstr)
{
cout << optcstr << endl;
typename T::const_iterator iter; //内嵌类型参数
for(iter = col.begin(); iter != col.end(); iter ++)
cout << *iter << " ";
cout << endl;
}
void print(int x) //函数作为算法参数
{
cout << x << " " ;
}
int main()
{
vector<int> col1;
for(int i = 0; i < 6; i ++)
col1.push_back(i);
PRINT_ELEMENT(col1, "here:");
for_each(col1.begin(), col1.end(), print); //函数作为算法的参数
return 0;
}
7、容器内元素的条件
(1)可以通过拷贝构造函数进行复制。容器都是在内部存放一个元素副本,并暂时性返回该暂时性副本。(STL中存放的是值而非引用)因此拷贝构造函数会经常被调用,故拷贝构造函数要尽可能优化。
(2)必须可以通过= 运算符进行赋值操作。容器和算法都使用赋值运算符,才能使新元素改写旧元素。
(3)必须可以通过析构函数完成销毁工作。当容器元素被移除时,它在容器内的副本被销毁。因此析构函数绝不可能设计成private。
8、容器的赋值/ swap
9、各种容器运用的时机
(1)缺省情况下,使用vector。vector的内部结构最简单,并允许随机存取,所以数据的存取十分灵活方便,数据的处理也够快。
(2)如果你经常要在序列头部和尾部安插和移除元素,应该使用deque。如果希望元素被移除时,容器能够自动缩减内存,那么应该使用deque。此外由于vector通常采用一个内存区块来存放元素,而deque采用多个区块,所有后者可内含更多元素。
(3)如果需要经常在容器的中间执行元素的安插、移除和移动,可以考虑使用list。list提供特殊的成员函数,可以在常数时间内将元素从A容器转移到B容器。但由于list不支持随机存取,所以如果只知道list的头部却要造访list的中段元素,性能会大打折扣。
和所有“以节点为基础”的容器相似,只要元素还是容器的一部分,list就不会令指向那些元素的迭代器失效。vector则不然,一旦超过其容量,它的所有iterator、pointers、references都会失效;执行安插或移除操作时,也会令一部分iterators、pointers、references失效。至于deque,当它的大小改变,所有iterators、pointers、references都会失效。
(4)如果需要的容器要求“每次操作若不成功,则无效用”(并以此态度来处理异常),那么应该选用list(但是不保证其assignment操作符和sort();而且如果元素比较过程中会抛出异常,就不要调用 merge(), remove(), remove_if(), unique()),或是采用关联式容器set、map等(但是不保证多元素安插动作,而且如果比较准则的复制、赋值动作都可能抛出异常,那么也不保证swap())。
(5)如果经常需要根据某个准则来搜寻元素,那么应该使用“以该排序准则对元素进行排序”的set或multiset。
(6)如果想处理 key/value 对,使用map或multimap(可以的话,使用hash-table)
(7)如果需要关联式数组,应采用map
(8)如果需要字典结构,使用multimap
10、各种不同类型容器的比较
11、发生异常时,各种不同类型容器的处理