文档详情

C++STL概述(copy).docx

发布:2017-12-19约9.41千字共10页下载文档
文本预览下载声明
C++STL概述(copy)混合迭代器函数在涉及到容器和算法的操作中,还有两个迭代器函数非常有用:? advance() 按指定的数目增减迭代器。? distance() 返回到达一个迭代器所需(递增)操作的数目。例如:listint iList;listint::iterator p = find(iList.begin(), iList.end(), 2);cout before: p == *p endl;advance(p, 2); // same as p = p + 2;cout after : p == *p endl; int k = 0;distance(p, iList.end(), k);cout k == k endl; advance()函数接受两个参数。第二个参数是向前推进的数目。对于前推迭代器,该值必须为正,而对于双向迭代器和随机访问迭代器,该值可以为负。使用distance()函数来返回到达另一个迭代器所需要的步骤。注意distance()函数是迭代的,也就是说,它递增第三个参数。因此,你必须初始化该参数。未初始化该参数几乎注定要失败。函数和函数对象STL中,函数被称为算法,也就是说它们和标准C库函数相比,它们更为通用。STL算法通过重载operator()函数实现为模板类或模板函数。这些类用于创建函数对象,对容器中的数据进行各种各样的操作。下面的几节解释如何使用函数和函数对象。函数和断言经常需要对容器中的数据进行用户自定义的操作。例如,你可能希望遍历一个容器中所有对象的STL算法能够回调自己的函数。例如#include iostream.h#include stdlib.h // Need random(), srandom()#include time.h // Need time()#include vector // Need vector#include algorithm // Need for_each() #define VSIZE 24// Size of vectorvectorlong v(VSIZE); // Vector object // Function prototypesvoid initialize(long ri);void show(const long ri);bool isMinus(const long ri); // Predicate function int main(){ srandom( time(NULL) ); // Seed random generator for_each(v.begin(), v.end(), initialize);//调用普通函数 cout Vector of signed long integers endl; for_each(v.begin(), v.end(), show); cout endl; // Use predicate function to count negative values // int count = 0; vectorlong::iterator p; p = find_if(v.begin(), v.end(), isMinus);//调用断言函数 while (p != v.end()) { count++; p = find_if(p + 1, v.end(), isMinus); } cout Number of values: VSIZE endl; cout Negative values : count endl; return 0;} // Set ri to a signed integer valuevoid initialize(long ri){ ri = ( random() - (RAND_MAX / 2) ); // ri = random();} // Display value of rivoid show(const long ri){ cout ri ;} // Returns true if ri is less than 0bool isMinus(const long ri){ return (ri 0);} 所谓断言函数,就是返回bool值的函数。函数对象除了给STL算法传递一个回调函数,你还可能需要传递一个类对象以便执行更复杂的操作。这样的一个对象就叫做函数对象。实际上函数对象就是一个类,但它和回调函数一样可以被回调。例如,在函数对象每次被for_each()或find_if()函数调用时可以保留统计信息。函数对象是通过重载operator()()实现的。如果Tany
显示全部
相似文档