C++还提供了其他一些类库,这些类库更加专用。

例如,头文件complex为复数提供了类模板complex,包含用于float、long和long double的具体化。

这个类提供了标准的复数运算以及能够处理复数的标准函数。

C++11新增的头文件random提供了更多的随机数功能。

头文件valarray提供的模板类valarray,这个类模板被设计成用于表示数值数组,

支持各种数值数组操作。例如将两个数组的内容相加,对数组的每个元素应用数学函数以及对数组进行线性代数运算。

====================================================

一、vector、valarray和array

这三个数组模板由三个不同的小组开发的,用于不同的目的:

vector模板是一个容器类和算法系统的一部分:它支持面向容器的操作,如排序、插入、重新排列、搜索、将数据转移到其他容器中等等;

valarray模板是面向数值计算的,不是STL的一部分:它没有push_back()和insert()方法,但为很多数学运算提供了简单、直观的接口;

array是为替代内置数组而设计的:它通过提供更好、更安全的接口,让数组更紧凑,效率更高。也不支持 push_back()和insert()方法;但提供多个STL方法,使得很容易将STL算法用于array对象。

vector<double> ved1(10), ved2(10), ved3(10);

array<double,10> vod1, vod2, vod3;

valarray<double> vad1(10), vad2(10), vad3(10);

同时,假设ved1、ved2、vod1、vod2、vad1、vad2都有合适的值。

要将两个数组中第一个元素的和赋给第三个数组的第一个元素,可以这样做:

1、使用vector类时

  transform(ved1.begin(), ved.end(), ved2.begin(),ved3.begin(), plus<double>());

2、使用array类时

  transform(vod1.begin(), vod1.end(), vod2.begin(), vod3.begin(), plus<double>());

3、valarray类重载了所有算术运算符,使其能够用于valarray对象,因此可以这样做:

  vad3 = vad1 + vad2;  //重载+运算符

  vad3 = vad1 * vad2;  //重载*运算符

要将数组中每个元素的值扩大2.5倍,STL方法如下:

transform(ved3.begin(), ved3.end(), ved3.begin(), bind1st(multiples<double>(), 2.5));

valarray类重载了将valarray对象乘以一个值的运算符;还重载了各种组合赋值运算符,因此可以采取下列两种方法:

  vad3 = 2.5 * vad3;  //重载 *

  vad3 *= 2.5;   //重载 *=

假设要计算数组中每个元素的自然对数,并将计算结果存储到另一个数组的相应元素中,STL方法如下:

transform(ved1.begin(), ved1.end(), ved3.begin(), log);

valarray类重载了这种数学函数,使之接受一个valarray参数,并返回一个valarray对象,因此可以这样做:

vad3 = log(vad1);   //log()  重载

valarray类提供了更清晰的表示方式,但通用性更低;

valarray类关注的东西更少,使得接口更加简洁;

 //接下来的例子比较了vector和valarray

 //valvect.cpp  --  comparing vector and valarray
#include <iostream>
#include <valarray>
#include <vector>
#include <algorithm> int main()
{
using namespace std;
vector<double> data;
double temp; cout<<""Enter numbers (<= to quit):\n;
while(cin >> temp && temp >)
data.push_back(temp);
sort(data.begin(), data.end());
int size = data.size();
valarray<double> numbers(size);
int i;
for(i = ; i < size; i++)
numbers[i] = data[i];
valarray<double> sq_rts(size);
sq_rts = sqrt(numbers);
valarray<double> results(size);
results = numbers + 2.0 * sq_rts;
cout.setf(ios_base::fixed);
cout.precision();
for(i = ; i<size; i++)
{
cout.width();
cout<<numbers[i]<<": ";
cout.width();
cout<<results[i]<<endl;
}
cout<<"done\n";
return ;
}
 //vslice.cpp -- using valarray slices
#include <iostream>
#include <valarray>
#include <cstdlib> const int SIZE = ;
typedef std::valarray<int> vint;
void Show(const vint & v, int cols); int main()
{
using std::slice;
using std::cout;
vint valint(SIZE); int i;
for(i = ; i<SIZE; ++i)
valint[i] = std::rand() % ;
cout <<"Original array:\n";
show(valint, ); vint vcol(valint[slice(,,)]);
cout <<"Second column:\n";
show(vcol, ); vint vrow(valint[slice(,,)]);
cout << "Second row:\n";
show(vrow, ); valint[slice(,,)] =;
cout<<"Set last column to 10:\n";
show(valint, ); cout<<"Set first column to sum of next two:\n";
valint[slice(,,)]= vint(valint[slice(,,)])+vint(valint[slice(,,)]);
show(valint,);
return ;
} void show(const vint & v, int cols)
{
using std::cout;
using std::endl; int lim = v.size();
for(int i = ; i<lim; ++i)
{
cout.width();
cout<<v[i];
if(i % cols == cols -)
cout<< endl;
else
cout<<' '; }
if(lim % cols != )
cout<<endl;
}

====================================================

二、模板initializer_list (C++11)及使用initializer_list

initializer_list是C++11新增的;可以使用初始化列表语法将STL容器初始化为一系列值;

std::vector<double> payments {45.99, 39.23, 19.95, 89.01};

这将创建一个包含4个元素的容器,并使用列表中的4个值来初始化这些元素。

这样做之所以可行,是因为容器类现在包含将initializer_list<T>作为参数的构造函数。

 //list.cpp  -- use initializer_list (C++11 feature)
#include <iostream>
#include <initializer_list> double sum(std::initializer_list<double> il);
double average(const std::initializer_list<double> & ril); int main()
{
using std::cout; cout<<"List 1: sum = "<< sum({,,}) << ", ave = "<<average({, , })<<'\n';
std::initializer_list<double> dl = {1.1, 2.2, 3.3, 4.4, 5.5};
cout<<"List 2: sum = "<<sum(dl)<<", ave = "<<sum(dl);
dl = {16.0, 25.0, 36.0, 40.0, 64.0};
cout<<"List 3: sum = "<<sum(dl)<<", ave = "<<average(dl)<<"\n";
return ;
} double sum(std::initializer_list<double> il)
{
double tot = ;
for(auto p = il.beigin(); p != il.end(); p++)
tot += *p;
return tot;
} double average(const std::initializer_list<double> &ril)
{
double tot = ;
int n = ril.size();
double ave = 0.0;
if(n>)
{
for(auto p = ril.begin(); p != ril.end(); p++)
tot += *p;
ave = tot/n;
}
}

====================================================

三、总结

1、C++提供了一组功能强大的库,这些库提供了很多常见编程问题的解决方案以及简化其他问题的工具;

2、string类为将字符串作为对象来处理提供了一组方便的方法;

3、智能指针模板使得管理由new分配的内存更加容易;

4、STL是一个容器类模板,迭代器类模板,函数对象模板和算法函数模板的集合,它们的设计都是一致的,基于泛型编程的原则;

5、STL使用术语“概念”来描述一组要求;

6、STL定义了很多容器类模板:vector\deque\list\set\multiset\map\multimap\bitset;

7、有些算法被表示为容器的方法,但大多数算法是通过非成员函数实现的,这是通过将迭代器作为容器与算法之间的接口实现的;

8、容器和算法都是由其提供的或者需要的迭代器表征的;

9、STL还提供了函数对象,即函数符;函数对象是重载了()运算符的类。此外还有自适应函数符的概念。

C++_标准模板库STL概念介绍5-其他库与总结的更多相关文章

  1. C++_标准模板库STL概念介绍1-建立感性认知

    标准模板库的英文缩写是STL,即Standard Template Library. STL里面有什么呢? 它提供了一组表示容器.迭代器.函数对象和算法的模板. 容器是一个与数组类似的单元,可以存储若 ...

  2. C++_标准模板库STL概念介绍4-算法

    STL包含很多处理容器的非成员函数: sort() copy() find() random_shuffle() set_union() set_intersection() set_differen ...

  3. C++_标准模板库STL概念介绍2-泛型编程

    有了之前使用STL的经验后,接下来讨论泛型编程及其底层的理念: 首先我们知道STL只是泛型编程的一种: 而面向对象的编程方式关注的是编程的数据方面: 而泛型编程关注的是算法: 但是,他们之间的一个重要 ...

  4. C++_标准模板库STL概念介绍3-函数对象

    函数对象也叫做函数符(functor). 函数符是可以以函数方式和( )结合使用的任意对象. 包括函数名,指向函数的指针,重载了()运算符的类对象. 可以这样定义一个类: class Linear { ...

  5. cb22a_c++_标准模板库_STL_map_multimap红黑树(数据结构)关联容器

    cb22a_c++_标准模板库_STL_map_multimap红黑树(数据结构)关联容器map(映射,key不能重复,一对一对的,value_type(1, "one")),mu ...

  6. cb23a_c++_标准模板库STL_set_multiset_关联容器

    cb23a_c++_标准模板库STL_set_multiset_关联容器 set(集)数据不能重复.multiset(多集)可以重复.操作数据速度快,数据自动排序.红黑树(数据结构)红黑树-二叉树基本 ...

  7. C++标准模板库Stand Template Library(STL)简介与STL string类

    参考<21天学通C++>第15和16章节,在对宏和模板学习之后,开启对C++实现的标准模板类STL进行简介,同时介绍简单的string类.虽然前面对于vector.deque.list等进 ...

  8. (C/C++学习笔记) 二十二. 标准模板库

    二十二. 标准模板库 ● STL基本介绍 标准模板库(STL, standard template library): C++提供的大量的函数模板(通用算法)和类模板. ※ 为什么我们一般不需要自己写 ...

  9. STL标准模板库介绍

    1. STL介绍 标准模板库STL是当今每个从事C++编程的人需要掌握的技术,所有很有必要总结下 本文将介绍STL并探讨它的三个主要概念:容器.迭代器.算法. STL的最大特点就是: 数据结构和算法的 ...

随机推荐

  1. 思考ASP.NET网站静态化的利与弊

    最近在思考网站要不要进行静态化的问题,在网上收集和整理了有关静态化利与弊的资料,于是写下此博文分享到网络上.由于本人是一名asp.net开发人员,所以本文的观点可能无法涉及到全部方面,但是比较注重于使 ...

  2. 简单的互斥同步方式——synchronized关键字详解

    目录 1. 关于synchronized关键字 2. synchronized的原理和实现细节 2.1 synchronized可以用在那些地方 2.2 synchronized是如何实现线程互斥访问 ...

  3. 开坑数位dp

    [背景] 在10月3日的dp专练中,压轴的第6题是一道数位dp,于是各种懵逼. 为了填上这个留存已久的坑,蒟蒻chty只能开坑数位dp了. [例题一][HDU2089]不要62 题目大意:给你一个区间 ...

  4. NOIP2012摆花

    题目描述 小明的花店新开张,为了吸引顾客,他想在花店的门口摆上一排花,共 m 盆.通过调查顾客的喜好,小明列出了顾客最喜欢的 n 种花,从 1 到 n 标号.为了在门口展出更多种花,规定第 i 种花不 ...

  5. PHP数组在循环的时候修改本身的值

    这样的修改并不是修改本身,$item就相当于赋值了一份数组中的值,就跟JAVA中的值方式传递值类型一样,我只是拿了你的值,并不是拿了你的内存地址,所已$item的改变,并不会影响数组 第一种方式就是直 ...

  6. dataTable写入数据库(大数据写入)

    例1: connectionStr,链接字符串dataTableName, 数据库中对应表名sourceDataTable DataTable 要写入数据库的DataTable字段要和表一致 publ ...

  7. 常用Xcode文档位置,修改Xcode项目模板地址总结,以及常用地址,随时更新。

    Xcode文档 ~/Library/Developer/Shared/Documentation/DocSets or /Applications/Xcode.app/Contents/Develop ...

  8. HighCharts SVN IReport进行PDF报表设计--模板

    BOS物流项目笔记第十五天 HIghcharts是很强大的图表绘制插件,它是基于纯js绘制的.当然地,对于图表也会有很多操作了.下面就我工作时遇到的一些比较常见的highcharts的操作进行小结,不 ...

  9. nmap 笔记

    本文由阿德马翻译自国外网站,请尊重劳动成果,转载请注明出处,谢谢 1.初级用法: 教程   Nmap使用不同的技术来执行扫描,包括:TCP的connect()扫描,TCP反向的ident扫描,FTP反 ...

  10. Load-time relocation of shared libraries

    E原文地址:http://eli.thegreenplace.net/2011/08/25/load-time-relocation-of-shared-libraries/ This article ...