现在的位置: 首页 > 综合 > 正文

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

2013年06月13日 ⁄ 综合 ⁄ 共 2104字 ⁄ 字号 评论关闭

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 

抱歉!评论已关闭.