博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
标准模板库介绍(一)
阅读量:5154 次
发布时间:2019-06-13

本文共 2302 字,大约阅读时间需要 7 分钟。

标准模板库包括三种泛型:容器、迭代器和算法。

容器

容器是一种包含多个元素的数据结构,这些元素通常具有相同的类型。容器的实现可以多种多样,然后真正具有实际应用意义的容器并不多,它们包含在STL中,这些容器有:deque、list、map、multimap、set、multiset、stack、queue、priority_queue以及vector。

STL容器实现为模板类。大多数容器具有相同的操作方法,但是各自实现不同,比如默认构造器,复制构造器,析构器,empty(), max_size(), size(), swap(), operator=,另外,除了priority_queue容器,其他容器还包含六个关系运算符(<, <=, !=, ==, >=, >)。

存储在容器内的类型可以是任意类型,但是这些类型必须支持默认构造器,析构器和复制运算。有些编译器可能还要求实现关系运算符重载,虽然程序用不到这些。当然,数据成员如果是指针的话,还必须实现复制构造和operator=函数,因为插入操作使用的是元素的副本而不是元素自身。

迭代器

迭代器用于引用存储在容器中的某个元素,所以它其实是一个指针。所以,通过迭代器可以访问容器中的元素并对元素进行某些操作。

算法

STL提供了大约70种泛型函数,这些泛型函数即算法,可以应用到STL容器以及数组上。

函数对象

函数调用操作符“()” 可以看成跟其他操作符一样,这样“()”操作符可以被重载。包含函数调用操作符定义的对象称为函数对象。函数对象的行为就跟函数一样。

看一个具体的例子

class square{public:    square() {    }    double operator() (double x) {        return x*x;    }};

这段代码中,square类定义中重载了函数调用操作符,实现对输入参数求平方并返回结果。

调用代码如下

double squaresum(square s, int n, int m) {    double res = 0;    if( n <= m)     for(int i = n; i <= m; i++)         res += s(i);    return res;}

以上代码中,给函数对象传入一个输入参数,这个参数将会使函数调用操作符的输入参数。

当然也可以不重载函数调用操作符,如下代码所示

class square {public:    square() {    }    double eval (double x) {        return x*x;    }};

调用代码则为

double squaresum (square s, int n, int m) {    double res = 0;    if (n <= m)         for (int i = n; i <= m; i++)            res += s.eval(i);    return res;}

测试代码为

cout << squaresum(square(), 1, 3) <

注意:这里测试代码要求square类实现自定义构造函数,这样square()可以构造一个函数对象。

STL中自带有一些函数对象。

unary_function

标准一元函数对象的基类,在一元函数对象中,operator()只能有一个参数。

unary_function是基类,它没有定义operator()方法,而是有派生类来实现。unary_function的定义为  

template 
struct unary_function { typedef Arg argument_type; typedef Result result_type;};  

下面给出一个简单的例子来说明用法

// unary_function example#include 
// std::cout, std::cin#include
// std::unary_functiontemplate
struct IsOdd : public std::unary_function
{ bool operator() (IN number) {
return (number%2!=0);}};int main () { IsOdd
IsOdd_object; IsOdd
::argument_type input; IsOdd
::result_type result; std::cout << "Please enter a number: "; std::cin >> input; result = IsOdd_object (input); std::cout << "Number " << input << " is " << (result?"odd":"even") << ".\n"; return 0;}

 

转载于:https://www.cnblogs.com/sjjsxl/p/5021834.html

你可能感兴趣的文章
UIPikerView的属性和使用方法
查看>>
解决idea创建ssm项目找不到mybatis的mapper的xml文件问题
查看>>
url里面的参数不能带特殊字符
查看>>
C#泛型编程基础知识总结【转】
查看>>
maven工程分开common和server
查看>>
洛谷 P2701 [USACO5.3]巨大的牛棚Big Barn
查看>>
虚基类
查看>>
背包的硬币问题
查看>>
linux查看CPU高速缓存(cache)信息
查看>>
VSFLEXgrid控件几个特殊的属性方法的使用
查看>>
GOIP connects with Elastix through “config by line”
查看>>
修改Win7远程桌面端口
查看>>
关于多线程的死锁
查看>>
2018-2019-1 20165205 20165233 实验二 固件程序设计
查看>>
APUE 学习笔记(三) 文件和目录
查看>>
APUE 学习笔记(十) 高级I/O
查看>>
Android Monkey压力测试
查看>>
BZOJ1878: [SDOI2009]HH的项链
查看>>
关于程序、进程和线程
查看>>
android登陆自动调整代码
查看>>