-
示例
template<class T> T median(std::vector<T> v) { typedef typename std::vector<T>::size_type vec_sz; vec_sz size = v.size(); std::sort(v.begin(), v.end()); vec_sz mid = size / 2; return (size & 1) == 0 ? (v[mid] + v[mid - 1]) / 2 : v[mid]; }
-
template – 模板头
告诉系统环境,定义的是一个模板函数
-
typedef typename std::vector::size_type vec_sz;
告诉系统环境,整个名称当作一个环境来处理
如果我们在声明中使用了由模板类型参数定义的类型,那么就必须用关键字 typename 来限定这个声明
-
-
模板实例化
-
实例化动作通常在链接期间发生,而不是在编译期间发生
只有模板被实例化了,系统环境才能证实,模板代码能被用于指定的类型,因此在链接期间,我们就可以发现那些看起来在编译期间可能发生的错误
-
为了对一个模板进行实例化,系统环境要求模板的定义+声明必须是系统环境可以访问的 ----> 模板的头文件和源文件都要可以访问 ----> 模板的头文件直接写模板定义,或者在头文件#include “sourceFile.cpp”,否则会报错
-
-
迭代器
扫描二维码关注公众号,回复: 8569869 查看本文章-
分为 5 种
(1) 输入迭代器
按一个方向顺序访问,只能输入
所有容器的迭代器都支持
(2) 输出迭代器
按一个方向顺序访问,只能输出
所有容器的迭代器都支持
(3) 正向迭代器
按一个方向顺序访问,既能输入也能输出
所有容器的迭代器都支持
(4) 双向迭代器
按两个方向顺序访问,既能输入也能输出
所有容器的迭代器都支持
(5) 随机访问迭代器
能有效访问任何元素,既能输入也能输出
vector和string的迭代器支持
-
迭代器区间 [begin, end) 的原因
(1) 当区间无元素时,无法找到最后一个元素标记终点
(2) 只需判定相等/不相等即可,无需定义小于操作
(3) 可以自然表示“区间外”的概念
-
标准库提供了可以被连接到输入流和输出流的迭代器
(1) 用于 istream 的迭代器满足了输入迭代器的要求
vector<int> v; // 从标准输入中读取整数值,并添加到v中 copy(istream_iterator<int>(cin), istream_iterator<int>(), back_inserter(v));
(2) 用于 ostream 的迭代器满足了输出迭代器的要求
vector<int> v; // 输出v的元素,元素之间用空格分隔 copy(v.begin(), v.end(), ostream_iterator<int>(cout, " "));
-
使用迭代器可以提高适应性
示例
template<class Out> void split(const string &str, Out os) { typedef string::const_iterator iter; iter i = str.begin(); while (i != str.end()) { i = find_if(i, str.end(), not_space); iter j = find_if(i, str.end(), space); if (i!=str.end()) { *os++ = string(i, j); } i = j; } }
这个方法的作用是将提取一句话中的各个单词,使用了迭代器的好处是提供了统一的接口,可以输出到任何容器类型中:
string s = "I'm a good man"; split(s, back_inserter(word_list));
通过 back_inserter,可以获取任何容器的目标位置,而不必关心容器本身是 vector 还是 list
-
chapter8_编写泛型函数
猜你喜欢
转载自blog.csdn.net/captxb/article/details/103052968
今日推荐
周排行