编程风格:泛型编程风格,基于对象的编程风格
一.泛型编程风格
1.指针的算术运算
对vector、array等内存连续的容器进行取值操作:
函数传入参数的不同类型 ---- 模板
内存连续 ---- 指针
通过模板和指针的结合构造出对容器的取值算法:
template <typename elemType>
elemType* find(const elemType* first,const elemType* last,const elemType* value)
{
if(!first||!last)
{
return 0;
}
for(;first!=last;++first)
if(*first == value)
{
return first;
}
return 0;
}
2.了解Iterator(泛型指针)
对list等内存非连续的容器进行遍历输出操作:(list的元素以一组指针相互链接:前项指针指向下一个元素,后向指针指向上一个元素。无法通过指针的++来对元素的访问)
使用泛型指针,使其指向容器开头,便依然可以使用++等符号对元素进行遍历操作。
list<string> svec;
list<string>::iterator iter = svec.begin;//利用泛型指针指向容器的开头
template <typename elemType>
void display(const list<elemType>& vec)
{
list<elemType>::const_iterator iter = vec.begin();
list<elemType>::const_iterator end_it = vec.end();
//如果vec是空的,iter便等于end_it
for(;iter!=end_it;iter++)
{
cout<<*iter<<' ';
}
cout<<endl;
}
利用泛型指针来对list容器进行查值:
template<typename IteratorType,typename elemType>
IteratorType find1(IteratorType first,IteratorType last,const elemType& value)
{
for(;first!=last;++first)
if(value == *first)
return first;
return last;
}
int main()
{
const int asize = 8;
int ia[asize] = {1,1,2,3,5,8,13,21};
list<int> ilist(ia,ia+asize);
list<int>::iterator iter;
iter = find1(ilist.begin(),ilist.end(),8);
if(iter != ilist.end())
cout<<"找到了";
return 0;
}
泛型算法列举:
顺序容器包括:vector、list、deque等。
容器还提供了一些特别的函数:push_back()会在末端插入一个元素,pop_back() 会删除最后一个元素。除此之外,list和deque还提供了push_front()和pop_front() 来对容器第一个元素进行增删。
#include<deque>
int main(){
deque<int> a_line;
int ival;
while(cin>>ival){
//将ival插入a_line末端
a_line.push_back(ival);
//读取a_line最前端元素的值
int curr_value = a_line.front();
//...进行操作
//删去a_line最前端元素
a_line.pop_front();
}
return 0;
}
如果要访问需要直接使用front()和back()函数。中间插入则是insert()函数。书上还列举了insert()的几种变形。
4. 使用泛型算法
使用泛型算法的要求:
#include<algorithm>
泛型搜索算法:
1.find() 用于搜索无序集合中是否存在某值。
2.binary_search()用于有序集合的搜索。
3.count() 返回数值相符的元素数目。
4.search() 比对某个容器内是否存在某个子序列。
其余泛型算法:
1.max_element() 返回数列中的最大值。
2.copy() 对容器内的数值进行复制。
5.如何设计一个泛型算法
我们用一个例子来说明如何设计一个泛型算法:
现在我们需要制作一个过滤器,过滤掉一个容器中的一些数据,例如:找出容器中大于10的数据并存入别的容器中。而这大于10都是可变的,是由我们自己设定的。示例如下:
#include<iostream>
#include<vector>
using namespace std;
//小于
bool less_than(int va1,int va2){
return va1<va2?true:false;
}
//大于
bool greater_than(int va1,int va2){
return va1>va2?true:false;
}
//过滤器函数,参数;被过滤容器,过滤判断值,函数指针(大于或小于)
vector<int> filter_ver1(const vector<int>& vec,int filter_value,bool (*pred)(int,int))
{
vector<int> nvec;
for(int ix = 0;ix < vec.size(); ++ix){
if(pred(vec[ix],fiter_value))
nevc.push_back(vec[ix]);
}
return nvec;
}
int main(){
vector<int> big_vec;
int value;
big_vec={1,2,3,4,5,6,7,8,9,10};
value = 5;
vector<int> It_10 = filter_ver1(big_vec,value,less_than);
for(int i = 0;i < It_10.size(); i++){
cout<<It_10[i]<<" ";
}
cout<<endl;
return 0;
}
function object
某种class的实例对象,对function call运算符做了重载操作,能让function object当成一般函数来用,这样可以提升效率。
function object实现了我们原本自定义一个函数才能实现的东西
标准库中事先定义了一组function object,比如plus<type(内置类型或class类型>,less<type>,logical_and<type>等,六个算术运算,六个关系运算,三个逻辑运算。
注意使用function object的时候,要包含头文件#include<functional>
function object a