Essential C++ 笔记 - 第三章泛型编程风格
一、模板
// 函数模板
// 定义
template <typename T1, typename T2>
T1 test(T2 t) {
// ...
}
// 调用
float ret = test(10);
// 定义
template <int Value>
int test() {
int ret = Value;
return ret;
}
// 调用
int ret = test<10>();
// 类模板
// 定义
template <typename T>
class test {
private:
T t;
public:
void show(T t1);
};
template <typename T>
void test::show(T t1){
// ...
}
// 调用
test<int> t;
template 与 template 一般情况下是通用的。但是,当T是一个类,而这个类又有子类时,应该使用 template
// typename T::innerClass myInnerObject;
// 这里的typename告诉编译器,T::innerClass是一个类,程序要声明一个T::innerClass类的对象,而不是声明T的静态成员。
二、容器
1、序列式容器( Sequential Container )
序列式容器用来维护一组排列有序、型别相同的元素。
#include
#include
#include
using namespace std;
// 产生空的容器
list<string> slist;
vector<int> ivec;
deque<char> cdeq;
// 产生特定大小的容器,每个元素都以其默认值(各类型的零值)作为初值
list<string> slist(1024);
vector<int> ivec(32);
deque<char> cdeq(16);
// 产生特定大小的容器,并为每个元素指定初值
list<string> slist(16, "unassigned");
vector<int> ivec(32, -1);
deque<char> cdeq(16, "c");
// 通过一对iterators产生容器,这对iterators用来标示一整组作为初值的元素区间
int ia[8] = {1,1,2,3,5,8,13,21};
vector<int> fib(ia, ia+8);
// 根据某个容器产生出新容器,复制原容器内的元素,作为新容器的初值。
list<string> slist1;
list<string> slist2(slist1);
2、关联式容器( Associative Containers )
关联式容器依据特定的排序准则,自动为其元素排序。排序准则以函数形式呈现,用来比较元素值( value )或元素键( key )。缺省情况下以operator<进行比较。
#include
#include
#include
using namespace std;
// 建立一份map,带有string(key)和int(value)
map<string, int> words;
// 输入key / value的方式
words["vermeer"] = 1;
words.insert(make_pair("test", 1));
// 建立一份set,存储类型为int
set<int> iset;
int ia[10] = {1,3,5,8,5,3,1,5,8,1};
vector<int> vec(ia, ia+10);
// 为set加入单一元素
iset.insert(1);
// 为set加入某个范围的元素
iset.insert(vec.begin(), vec.end());
// multisets / multimap 和 set / map的区别:
multisets集合中可以存放重复的元素,set不能。
multimap中可以存放键值相同的元素对,map不能。
multimap参考
三、泛型算法
#include
using namespace std;
int ia[10] = {0,1,2,3,4,5,6,7,8,9};
vector<int> vec(ia, ia+10);
vector<int> vec2(ia+5, ia+7);
// 泛型搜寻算法
// find()用于搜寻无序集合中是否存在某值。搜寻范围由iterators(first, last)标出。如果找到目标,find()会返回一个iterator指向该值,否则返回一个iterator指向last
vector<int>::iterator vIter = find(vec.begin(), vec.end(), 5);
// binary_search用于搜寻有序集合,如果找到目标,返回true;否则返回false。(二分查找)
binary_search(vec.begin(), vec.end(), 5);
// count()返回数值相符的元素数目
count(v.begin(), v.end(), 5);
//search()比较某个容器内是否存在某个子序列。若存在,则返回指向子序列起始处的iterator;否则返回指向容器末尾的iterator。
vector<int>::iterator vIter = search(vec.begin(), vec.end(), vec2.begin(), vec2.end());
// 所有容器的共通操作
· equality( == ) 和 inequality( != ),返回true或false
· assignment( = ),将某个容器复制给另一个容器
· empty() 在容器为空时返回true,否则返回false
· size()返回容器当前含有的元素数目
· clear() 删除容器内所有元素
// TODO: 补充泛型算法
四、仿函式( Function Object )
#include
// 算术运算
plus<type>, minus<type>, negate<type>, multiplies<type>, divides<type>, modules<type>
// 关系
less<type>, less_equal<type>, greater<type>, greater_equal<type>, equal_to<type>, not_equal<type>
// 逻辑运算
logiacal_and<type>, logical_or<type>, logical_not<type> // 分别对应&&,||,!
// 仿函式示例
template <typename T>
struct plus
{
T operator ()(const T& x, const T& y) { return x + y; }
};
template <typename T>
struct greater {
bool operator()(const T& left, const T& right) {
return (left < right);
}
};