Essential C++ 笔记 - 第三章泛型编程风格

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);
	}
};

Essential C++ 笔记 - 第三章泛型编程风格_第1张图片

你可能感兴趣的:(Essential C++ 笔记 - 第三章泛型编程风格)