Your Ad Here
首页 | 编程语言 | 网站建设 | 游戏天堂 | 冲浪宝典 | 网络安全 | 操作系统 | 软件时空 | 硬件指南 | 病毒相关 | IT 认证
软讯网络 > 编程语言 > C/C++ > stl学习笔记2(容器,函数对象)
【标  题】:stl学习笔记2(容器,函数对象)
【关键字】:stl
【来  源】:http://blog.csdn.net/wqf363/archive/2006/12/11/1438863.aspx

stl学习笔记2(容器,函数对象)

Your Ad Here

3 组件二:容器
你可以生成STL容器,用来存放对象或者指向对象的指针。
class TMyClass;
typedef list<TMyClass> TMyClassList;     // 用于存放对象的list容器
typedef list<TMyClass*> TMyClassPtrList; // 用于存放对象指针的list容器
 
如果容器是保存的对象,则在容器析构的时候会自动清理这些对象。但,如果它保存的是对象的指针,删除指针就应该是程序员的责任了。

容器类型:

       包括序列容器与关联容器。

容器迭代器:

       STL中的所有标准容器类都提供四种不同的迭代器类型:iteratorconst_iteratorreverse_iteratorconst_reverse_iterator

下图清晰的表明了不同类型的迭代器之间的转换关系:

4 组件三:函数对象(重点)

STL算法通过重载operator()函数实现为模板类或模板函数。这些类用于创建函数对象,对容器中的数据进行各种各样的操作。下面解释如何使用函数和函数对象。

所谓断言函数,就是返回bool值的函数, 就是它从另一个函数对象创建而来,如果原先的函数返回真,则否定函数对象返回假。有两个否定函数对象:not1()not2()not1()接受单目函数对象,not2()接受双目函数对象。否定函数对象通常和帮定器一起使用。

除了给STL算法传递一个回调函数,你还可能需要传递一个类对象以便执行更复杂的操作。这样的一个对象就叫做函数对象。实际上函数对象就是一个类,但它和回调函数一样可以被回调。例如,在函数对象每次被for_each()find_if()函数调用时可以保留统计信息。函数对象是通过重载operator()()实现的。如果TanyClass定义了opeator()(),那么就可以这么使用:

TAnyClass object;  // Construct object

object();          // Calls TAnyClass::operator()() function

for_each(v.begin(), v.end(), object);

发生器函数对象

有一类有用的函数对象是发生器”(generator)。这类函数有自己的内存,也就是说它能够从先前的调用中记住一个值。例如随机数发生器函数。

#include <iostream.h>

#include <stdlib.h>    // Need random(), srandom()

#include <time.h>      // Need time()

#include <algorithm>   // Need random_shuffle()

#include <vector>      // Need vector

#include <functional>  // Need ptr_fun()

#include <iterator>

 

using namespace std;

 

// Data to randomize

int iarray[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

vector<int> v(iarray, iarray + 10);

 

// Function prototypes

void Display(vector<int>& vr, const char *s);

unsigned int RandInt(const unsigned int n);

 

int main()

{

  srandom( time(NULL) );  // Seed random generator

  Display(v, "Before shuffle:");

 

  pointer_to_unary_function<unsigned int, unsigned int>

    ptr_RandInt = ptr_fun(RandInt);  // Pointer to RandInt()//注意这行

  random_shuffle(v.begin(), v.end(), ptr_RandInt);

 

  Display(v, "After shuffle:");

  return 0;

}

 

// Display contents of vector vr

void Display(vector<int>& vr, const char *s)

{

  cout << endl << s << endl;

  copy(vr.begin(), vr.end(), ostream_iterator<int>(cout, " ")); //space

  cout << endl;

}

 

// Return next random value in sequence modulo n

unsigned int RandInt(const unsigned int n)

{

  return random() % n;

}

绑定器函数对象

一个绑定器使用另一个函数对象f()和参数值V创建一个函数对象。被绑定函数对象必须为双目函数,也就是说有两个参数,ABSTL 中的帮定器有:

bind1st() 创建一个函数对象,该函数对象将值V作为第一个参数A

bind2nd()创建一个函数对象,该函数对象将值V作为第二个参数B 
qt-designer使用教程3--编写自己的槽:【上一篇】
Pointer-to-Pointer and Reference-to-Pointer:【下一篇】
【相关文章】
  • 使用C++(STL)+Cgicc+OTL+prototype开发简易CGI留言本(3完结)
  • stl学习笔记1(入门速览与迭代器)
  • JSTL资料收集
  • stl实现序列化
  • 在linux下一个有趣的STL文件IO问题
  • C++ STL(标准模板库) 学习资源列表
  • 理解STL中的函数子,函数子类,和其用法
  • std::string及iostream实现性能比较:stlport VS GNU libstdc++
  • 使用C++(STL)+Cgicc+OTL+prototype开发简易CGI留言本(2)
  • stl 容器(1)
  • 【随机文章】
  • 第六章 ISNS属性(ISNS Attributes)--ISNS属性概要、以EID为key存储的属性
  • 访问VMWare中postgresql的配置
  • NETSCREEN防火墙所用到的一些术语的说明
  • Painter 8 粉笔画教程《编织美丽的色彩》(2)
  • Linux设置环境变量
  • 防止SQL注入的函数
  • 如何认识、预防和杜绝病毒
  • DataList绑定多维数组的问题和解决方案
  • solaris 维护速查手册
  • 好久没和大家见面了!
  • 【相关评论】
    没有相关评论
    【发表评论】
    姓名:
    邮件:
    随机码*
    评论*
          
    |  首 页  |  版权声明  |  联系我们   |  网站地图  |
    CopyRight © 2004-2007 bbb软讯网络 All Rigths Reserved.