C++_标准模板库STL概念介绍5-其他库与总结
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
1 //valvect.cpp -- comparing vector and valarray 2 #include <iostream> 3 #include <valarray> 4 #include <vector> 5 #include <algorithm> 6 7 int main() 8 { 9 using namespace std; 10 vector<double> data; 11 double temp; 12 13 cout<<""Enter numbers (<= to quit):\n; 14 while(cin >> temp && temp >0) 15 data.push_back(temp); 16 sort(data.begin(), data.end()); 17 int size = data.size(); 18 valarray<double> numbers(size); 19 int i; 20 for(i = 0; i < size; i++) 21 numbers[i] = data[i]; 22 valarray<double> sq_rts(size); 23 sq_rts = sqrt(numbers); 24 valarray<double> results(size); 25 results = numbers + 2.0 * sq_rts; 26 cout.setf(ios_base::fixed); 27 cout.precision(4); 28 for(i = 0; i<size; i++) 29 { 30 cout.width(8); 31 cout<<numbers[i]<<": "; 32 cout.width(8); 33 cout<<results[i]<<endl; 34 } 35 cout<<"done\n"; 36 return 0; 37 }
1 //vslice.cpp -- using valarray slices 2 #include <iostream> 3 #include <valarray> 4 #include <cstdlib> 5 6 const int SIZE = 12; 7 typedef std::valarray<int> vint; 8 void Show(const vint & v, int cols); 9 10 int main() 11 { 12 using std::slice; 13 using std::cout; 14 vint valint(SIZE); 15 16 int i; 17 for(i = 0; i<SIZE; ++i) 18 valint[i] = std::rand() % 10; 19 cout <<"Original array:\n"; 20 show(valint, 3); 21 22 vint vcol(valint[slice(1,4,3)]); 23 cout <<"Second column:\n"; 24 show(vcol, 1); 25 26 vint vrow(valint[slice(3,3,1)]); 27 cout << "Second row:\n"; 28 show(vrow, 3); 29 30 valint[slice(2,4,3)] =10; 31 cout<<"Set last column to 10:\n"; 32 show(valint, 3); 33 34 cout<<"Set first column to sum of next two:\n"; 35 valint[slice(0,4,3)]= vint(valint[slice(1,4,3)])+vint(valint[slice(2,4,3)]); 36 show(valint,3); 37 return 0; 38 } 39 40 void show(const vint & v, int cols) 41 { 42 using std::cout; 43 using std::endl; 44 45 int lim = v.size(); 46 for(int i = 0; i<lim; ++i) 47 { 48 cout.width(3); 49 cout<<v[i]; 50 if(i % cols == cols -1) 51 cout<< endl; 52 else 53 cout<<' '; 54 55 } 56 if(lim % cols != 0) 57 cout<<endl; 58 }
====================================================
二、模板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>作为参数的构造函数。
1 //list.cpp -- use initializer_list (C++11 feature) 2 #include <iostream> 3 #include <initializer_list> 4 5 double sum(std::initializer_list<double> il); 6 double average(const std::initializer_list<double> & ril); 7 8 int main() 9 { 10 using std::cout; 11 12 cout<<"List 1: sum = "<< sum({2,3,4}) << ", ave = "<<average({2, 3, 4})<<'\n'; 13 std::initializer_list<double> dl = {1.1, 2.2, 3.3, 4.4, 5.5}; 14 cout<<"List 2: sum = "<<sum(dl)<<", ave = "<<sum(dl); 15 dl = {16.0, 25.0, 36.0, 40.0, 64.0}; 16 cout<<"List 3: sum = "<<sum(dl)<<", ave = "<<average(dl)<<"\n"; 17 return 0; 18 } 19 20 double sum(std::initializer_list<double> il) 21 { 22 double tot = 0; 23 for(auto p = il.beigin(); p != il.end(); p++) 24 tot += *p; 25 return tot; 26 } 27 28 double average(const std::initializer_list<double> &ril) 29 { 30 double tot = 0; 31 int n = ril.size(); 32 double ave = 0.0; 33 if(n>0) 34 { 35 for(auto p = ril.begin(); p != ril.end(); p++) 36 tot += *p; 37 ave = tot/n; 38 } 39 }
====================================================
三、总结
1、C++提供了一组功能强大的库,这些库提供了很多常见编程问题的解决方案以及简化其他问题的工具;
2、string类为将字符串作为对象来处理提供了一组方便的方法;
3、智能指针模板使得管理由new分配的内存更加容易;
4、STL是一个容器类模板,迭代器类模板,函数对象模板和算法函数模板的集合,它们的设计都是一致的,基于泛型编程的原则;
5、STL使用术语“概念”来描述一组要求;
6、STL定义了很多容器类模板:vector\deque\list\set\multiset\map\multimap\bitset;
7、有些算法被表示为容器的方法,但大多数算法是通过非成员函数实现的,这是通过将迭代器作为容器与算法之间的接口实现的;
8、容器和算法都是由其提供的或者需要的迭代器表征的;
9、STL还提供了函数对象,即函数符;函数对象是重载了()运算符的类。此外还有自适应函数符的概念。
转载于:https://www.cnblogs.com/grooovvve/p/10491705.html
C++_标准模板库STL概念介绍5-其他库与总结相关推荐
- 蓝桥杯单片机设计与开发_标准模板
蓝桥杯单片机设计与开发_标准模板 一.前言 首先,这篇文章是笔者第一次在 CSDN 上写博文,较为生疏,读者若有任何意见,欢迎大家在评论区交流! 笔者目前为一名大二学生,参加了2021年蓝桥杯单片机设 ...
- 算法笔记.胡凡 第6章 C++标准模板库(STL)介绍
6.1 vector常见用法详解 6.1.1.vector定义 vector<int> name; 6.1.2.vector容器元素访问 (1) 下标:v[0] (2)迭代器 vector ...
- C++11标准模板(STL)- 算法(std::set_symmetric_difference)
定义于头文件 <algorithm> 算法库提供大量用途的函数(例如查找.排序.计数.操作),它们在元素范围上操作.注意范围定义为 [first, last) ,其中 last 指代要查询 ...
- C++11标准模板(STL)- 算法(std::nth_element)
定义于头文件 <algorithm> 算法库提供大量用途的函数(例如查找.排序.计数.操作),它们在元素范围上操作.注意范围定义为 [first, last) ,其中 last 指代要查询 ...
- C++11标准模板(STL)- 算法 - 集合操作(在已排序范围上)(std::set_difference)
定义于头文件 <algorithm> 算法库提供大量用途的函数(例如查找.排序.计数.操作),它们在元素范围上操作.注意范围定义为 [first, last) ,其中 last 指代要查询 ...
- C++11标准模板(STL)- 算法(std::adjacent_difference)
定义于头文件 <algorithm> 算法库提供大量用途的函数(例如查找.排序.计数.操作),它们在元素范围上操作.注意范围定义为 [first, last) ,其中 last 指代要查询 ...
- c++ 11标准模板(STL) std::vector (八)
定义于头文件 <vector> template< class T, class Allocator = std::allocator<T> > class ...
- C++11标准模板(STL)- 算法 - 数值运算 (std::accumulate)
定义于头文件 <algorithm> 算法库提供大量用途的函数(例如查找.排序.计数.操作),它们在元素范围上操作.注意范围定义为 [first, last) ,其中 last 指代要查询 ...
- C++11标准模板(STL)- 算法(std::iota)
定义于头文件 <algorithm> 算法库提供大量用途的函数(例如查找.排序.计数.操作),它们在元素范围上操作.注意范围定义为 [first, last) ,其中 last 指代要查询 ...
最新文章
- 200 ssl服务器证书无效_ssl证书无效怎么办?
- 004_Icon图标
- Hibernate Annotation _List/Map
- JMeter场景设置与监控
- Go:获取命令行参数
- c语言字符串字节数函数,C语言字符,字符串,字节操作常用函数
- webpack和 php配合,javascript - webpack和laravel-elixir-webpack的正确配合方式?
- php构造函数里抛出异常_构造函数、析构函数抛出异常的问题
- 基于matlab仿真实例,基于MATLAB的新能源汽车仿真实例
- 学习笔记0525----NFS文件共享和FTP服务器
- c++中类的private的static变量实现类对象的数据共享
- 邮件服务器lp在哪找,lp地址查询_ip地址查询定位
- android 模拟menu键点击事件,android处理Back键Home键和Menu键事件(转)
- 属相对应年份php,PHP计算天干地支和生肖,年份无两百年限制
- 怀念父亲母亲-端午节快乐
- nodejs和php性能,Nodejs 和PHP 性能测试结果
- c1欧洲语言标准是什么水平,CEFR 为什么会成为全球语言标准体系?
- 在64位总线下,安装了8G内存条,却显示可用内存不到8G的原因
- 布斯乘法 Mips实现 - Booth Algorithm
- C语言 ltoa sprintf strcat
热门文章
- 下面不属于python第三方库的安装方法的是-Python第三方库安装和卸载
- python3.6.0安装教程-centos6.9安装python3.6.0和模块
- python处理流程-python流程处理
- python推荐系统-python 新闻推荐系统(基于新闻内容推荐)
- 如何系统的自学python 知乎-应该怎样系统的学习Python标准库?
- python简单项目-Python小项目:快速开发出一个简单的学生管理系统
- 在导入graphsurgeon时报错:ImportError: cannot import name ‘NodeDef‘ from ‘tensorflow‘
- git clone一个github上的仓库非常缓慢 和 github网页打不开
- grpc中监听端口添加及绑定
- spring中IOC设计与实现