C++泛型编程总结(二)
2016-04-01 20:49
337 查看
目录:
7.插入insert()的变形
8.Function Object
9.设计泛型算法Function Object Adapter与Insertion adapter
10.关联容器map和set
11.iostream Iterator
7.插入insert()的变形
iterator insert(iterator position,elemType value),插入到position之前,并返回插入元素的iterator,可用于将ival插入ilist并维持其递增次序
void insert(iterator position,int count,elemType value)可在position之前插入count个值为value的元素
void insert(iterator1 position,iterator2 first,iterator2 last)可在position之前插入[first,last)所标示的各个元素
void insert(iterator position)可在position之前插入元素,初值为其所属类型的默认值
iterator erase(iterator posit)可删除posit所指的元素,返回被删除元素的下一个iterator
8.Function Object
实现了原本可能以独立函数定义的实物 #include<functional>
目的是提高效率,令call运算符成为inline,消除“通过函数指针来调用函数”时需要付出的额外代价。
分为三类
算术arithmetic:plus<type>,minus<type>,negate<type>,multiplies<type>,divides<type>,modules<type>
关系relational:less<type>,less_equal<type>,greater<type>,greater_equal<type>,equal_to<type>,not_equal_to<type>
逻辑logical:logical_and<type>,logical_or<type>,logical_not<type>
例子:sort(vec.begin(),vec.end(),greater<int>());
9.设计泛型算法Function Object Adapter与Insertion adapter
bind1st:将指定值绑定至第一操作数
bind2nd:将指定值绑定至第二操作数
以下例子不仅展示bind2nd,也展示Filter()
消除:1.容器类型,2.元素类型,3.“比较操作”参数化,使得同时支持函数指针和fun object,4.可自定义比较操作
附注:filter()的参数中,OutStorage用于存filter后的元素,若不想【事先定义】容器的大小,可以用Insertion adapter,但不能用在array上
back_inserter(ivec2):以push_back()的方式插入代替assignment
front_inserter(ivec2):以push_front()的方式插入代替assignment,只适用于list和deque
inserter(ivec2,ivec.end):以容器的insert()的方式插入代替assignment,第一个参数是容器,第二个是迭代器,指向容器内插入操作的起点
10.关联容器map和set
注意这两个容器都是基于红黑树的,要实现时间复杂度为log(k)的插入删除操作,可以利用这两个容器
(1)map
map<string,int> mword[word]++,存在key值word就会给value值+1,不存在就会创建key值word,value为默认值0,然后+1
一个key只有一份
it.first(),it.second(),要遍历可以用iterator不断自增,知道it == mword.end()
mword.find("vermmer"),找到就返回迭代器指向pair类型,否则返回end();
mword.count(word),返回word出现的次数
(2)set
只存储key值,并按照默认less-than排列,遍历可用iterator
可用来存储map中想要的or不想要的key
一个key只有一份
11.iostream Iterator
认识就好了,这种输入还好,输出有些局限
7.插入insert()的变形
8.Function Object
9.设计泛型算法Function Object Adapter与Insertion adapter
10.关联容器map和set
11.iostream Iterator
7.插入insert()的变形
iterator insert(iterator position,elemType value),插入到position之前,并返回插入元素的iterator,可用于将ival插入ilist并维持其递增次序
for( list<int>::iterator it=ilist.begin();it != ilist.end();++it){ if(*it>value) ilist.insert(it,value); break; } if(it==ilist.end()) ilist.push_back(value);
void insert(iterator position,int count,elemType value)可在position之前插入count个值为value的元素
void insert(iterator1 position,iterator2 first,iterator2 last)可在position之前插入[first,last)所标示的各个元素
void insert(iterator position)可在position之前插入元素,初值为其所属类型的默认值
iterator erase(iterator posit)可删除posit所指的元素,返回被删除元素的下一个iterator
list<string>::iterator it =find(slist.begin(),slist.end(),str); slist.erase(it); //删除值为str的元素iterator erase(iterator first,iterator last)删除[first,last)范围内的元素,返回被删除的最后一个元素的下一个iterator
8.Function Object
实现了原本可能以独立函数定义的实物 #include<functional>
目的是提高效率,令call运算符成为inline,消除“通过函数指针来调用函数”时需要付出的额外代价。
分为三类
算术arithmetic:plus<type>,minus<type>,negate<type>,multiplies<type>,divides<type>,modules<type>
关系relational:less<type>,less_equal<type>,greater<type>,greater_equal<type>,equal_to<type>,not_equal_to<type>
逻辑logical:logical_and<type>,logical_or<type>,logical_not<type>
例子:sort(vec.begin(),vec.end(),greater<int>());
9.设计泛型算法Function Object Adapter与Insertion adapter
bind1st:将指定值绑定至第一操作数
bind2nd:将指定值绑定至第二操作数
以下例子不仅展示bind2nd,也展示Filter()
消除:1.容器类型,2.元素类型,3.“比较操作”参数化,使得同时支持函数指针和fun object,4.可自定义比较操作
template<typename InputIterator,typename OutputIterator, typename ElemType,typename Comp> OutputIterator Filter(InputIterator first,InputIterator last, OutputIterator OutStorage,const ElemType& value,Comp pFunction) { while( (first = find_if(first,last,bind2nd(pFunction,value)) )!= last ){ cout<<"Found Value:"<<*first<<endl; *OutStorage++ = *first++;} return OutStorage; } int main() { int ia[8] = {12,8,43,0,6,21,3,7}; vector<int> vec(ia,ia+8); //下面这个容器用来储存过滤结果 int ia2[8]; vector<int> ivec2(8); cout<<"array values less than 8\n"; Filter(ia,ia+8,ia2,8,less<int>()); cout<<"vector values greater than 8\n"; Filter(vec.begin(),vec.end(),ivec2.begin(),8,greater<int>()); }
附注:filter()的参数中,OutStorage用于存filter后的元素,若不想【事先定义】容器的大小,可以用Insertion adapter,但不能用在array上
back_inserter(ivec2):以push_back()的方式插入代替assignment
front_inserter(ivec2):以push_front()的方式插入代替assignment,只适用于list和deque
inserter(ivec2,ivec.end):以容器的insert()的方式插入代替assignment,第一个参数是容器,第二个是迭代器,指向容器内插入操作的起点
//filter的写法不变 #include<iterator> vector<int> ivec2; Filter(vec.begin(),vec.end(),back.begin(),back_inserter(ivec2),8,greater<int>());
10.关联容器map和set
注意这两个容器都是基于红黑树的,要实现时间复杂度为log(k)的插入删除操作,可以利用这两个容器
(1)map
map<string,int> mword[word]++,存在key值word就会给value值+1,不存在就会创建key值word,value为默认值0,然后+1
一个key只有一份
it.first(),it.second(),要遍历可以用iterator不断自增,知道it == mword.end()
mword.find("vermmer"),找到就返回迭代器指向pair类型,否则返回end();
mword.count(word),返回word出现的次数
(2)set
只存储key值,并按照默认less-than排列,遍历可用iterator
可用来存储map中想要的or不想要的key
一个key只有一份
ia[10]={1,3,5,8,5,3,1,5,8,1}; vector<int> vec(ia,ia+10) set<int> iset<vec.begin(),vec.end()>//{1,3,5,8} iset.insert(ival) //插入一个 iset.insert(vec.begin(),vec.end()) //插入
11.iostream Iterator
认识就好了,这种输入还好,输出有些局限
#include<iostream> #include<vector> #include<string> #include<iterator> #include<algorithm> using namespace std; int main() { istream_iterator<string> is(cin); istream_iterator<string> eof; //不指定就是end-of-file vector<string> text; copy(is,eof,back_inserter(text)); //text没有设置大小,需指定插入方式 sort(text.begin(),text.end()); //排序 ostream_iterator<string> os(cout," "); //输出间隔为空格 copy(text.begin(),text.end(),os); } 从文件中读写 #include<fstream> ifstream infile("input_file.txt"); ofstream outfile("output_file.txt"); if(!infile || !outfile) {……} istream_iterator<string> is(infile);