1. 基本用法
template< class T >
template< typename T>
声明:
template < typename T , typename T2 >
class Array{
void show();
}
实现:
template<class T , class T2> //要放在前面,不然...
void Array<T, T2>::show(){ /* * * * */ }
模板类可以作为一种数据类型出现在参数列表中:
template< typename T, typename T2>
ostream & operator << ( ostream & os, const Array< T, T2> & ar){ /****/}
以上可以用在 cout 上重载 << 运算符.
模板类作为函数式参数:
template Array<class T, int S>
assert 的使用:
#include <cassert>
// assert( true ); <-- 当为 true 时正常...
// 关闭 assert <-- 在 include <cassert > 之前加上 #define NDEBUG
// 注:最好把 assert 写在文件的最开始位置,因为,貌似 <iostream>中已经包含了此宏的定义.
2.STL 容器,算法, 迭代器
容器:vector,stack,queue,deque,list,set,map
(向量,关联数组,集合,堆栈,序列)
算法:copy,sort,search,merge,permute
sort 对 vector,deque,set起作用 ...... 默认使用 升序
迭代器:
如 list<int>::iterator it;
vector<int>::const_iterator c_it;
// it++ ; it != x.end();
容器分类:
关联式:
list 双向链表, vector 数组, deque 两端进行插入删除的队列
关联式:
set, multiset, map, multimap
vector: ----->在队尾插入效率高,在头部插入耗费时间与 size() 成正比.
v.insert(v.begin(),110);
v.erase(v.begin());
v.size();
v.reverse();
v.push_back();
deque: -----> 两端操作的效率一样. double-ended queue;
list : -----> 链表
set : 可用insert插入,用 find 查找
s.insert(s.begin(), 100) 或 s.insert(100) // 指定位置或不指定位置均可
s.find(100) != s.end() ? 找到了 : 没找到;
map: 可用下标操作
容器适配器:利用基本容器实现特定功能,包括三种: stack,queue,priority_queue;
stack : top(),pop(),push(),size(),empty() //无push_back();
queue: front(),pop(),push(),back(), //无push_back();
priority_queue: top(),push(),pop(),
其它容器:
string: for_each( s.rbegin(), s.rend(), print );
char * where = find( s.begin(), s.end(), 'a' );
sort( s.begin(), s.end() );
bitset: 实际上是位串 <bitset>
bitset< 8 > bs(9u);
3. STL算法
reverse( v.begin(), v.end() )
generate( v.begin(), v.end(), rand );
replace_if( v.begin(), v.end(), isOdd, 0);
sort( v.begin(), v.end(), cmp );
for_each( v.begin(), v.end(), dump)
copy( a, a + len, ostream_iterator< char > ( cout, " " );
// 要有 #include <iterator>
4. 其它STL构件
函数对象: 重载 () 运算符的类
函数适配器: 以现有函数对象来创建新函数对象....用于特化和扩展一元和二元函数对象。
绑定器:它通过将一个操作数绑定到给定值而将二元函数对象转换为一元函数对象。