1、泛型程序设计:将程序尽可能写的通用,将算法从特定的数据结构中抽象出来,成为通用的;C++模板为泛型程序设计奠定了关键的基础;STL是泛型程序设计的一个范例:容器container、迭代器iterator、算法algorithms和函数对象function object。

2、命名空间namespace:一个命名空间将不同的标识符集合在一个命名作用域(named scope)中,是为了解决命名冲突。没有声明命名空间的标识符都处在无名的命名空间中。

例如,声明一个命名空间NS:
namspace NS {
class File;
void Fun ();
}
则引用标识符的方式如下,
NS:: File obj;
NS:: Fun ();

可以利用using namespace std;指定在命名空间std中所有标识符都可以直接饮用,using NS::file;在当前作用域中就可以直接饮用file。

在新的C++标准程序库中,所有标识符都声明在命名空间std中,头文件都不使用扩展名。

3、容器:容器类是容纳、包含一组元素或元素集合的对象。异类容器类与同类容器类。还可以分为顺序容器与关联容器。七种基本容器:向量(vector)、双端队列(deque)、列表(list)、集合(set)、多重集合(multiset)、映射(map)和多重映射(multimap)

容器的接口:外界可以使用的功能。包括方法函数和运算符。

通用运算符:==,!=,>,>=,<,<=,=
迭代方法begin(),end(),rbegin(),rend();访问方法size(),max_size(),swap(),empty()

顺序容器:接口:插入方法 push_front(), push_back(), insert(), 运算符"="。

删除方法 pop(), erase(),clear()

迭代访问方法 使用迭代器

其他顺序容器访问方法(不修改的访问方法) front(),back(),下标运算符[]。

顺序容器向量:向量属于顺序容器,用于容纳不定长的线性序列,提供对序列的快速随机访问,就是直接访问。向量是动态结构,它的大小不固定,可以在程序运行时增加或者减少。

例子:求反问2~N中的质数,N在程序运行时由键盘输入。

#include <iostream>
#include <iomanip>
#include <vector> //包含向量容器头文件
using namespace std ;
int main()
{   
    vector<int>  A(10); // 用来存放质数的向量,初始状态有10个元素。
    int n; //质数范围的上限,运行时输入
    int primecount = 0, i, j;
    cout << "Enter a value >= 2 as upper limit for prime numbers: ";
    cin >> n;
    A[primecount++] = 2; // 2是一个质数
    for(i = 3; i < n; i++)
    {
        if (primecount == A.size()) // 如果质数表已满,则再申请10个元素的空间
            A.resize(primecount + 10);
        if (i % 2 == 0) //大于2的偶数不是质数,因此略过本次循环的后继部分
            continue;
        // 检查3,5,7,...,i/2是否i的因子
        j = 3;
        while (j <= i/2 && i % j != 0)
            j += 2;       

        if (j > i/2) // 若上述参数均不为i的因子,则i为质数
            A[primecount++] = i;
    }
    for (i = 0; i < primecount; i++) //输出质数
    {
        cout << setw(5) << A[i];
        if ((i+1) % 10 == 0) //每输出10个数换行一次
            cout << endl;
    }
    cout << endl;
}

4、适配器:适配器是一种接口类,为已有的类提供新的接口,目的是简化、约束,使之安全、隐藏或者改变被修改类提供的服务的集合。主要有三种适配器类型:容器适配器(用来扩展7中基本容器),迭代器适配器和函数对象适配器。

5、迭代器:是面向对象版本的指针,提供了访问容器、序列中每个元素的方法

输入迭代器
可以用来从序列中读取数据
输出迭代器
允许向序列中写入数据
前向迭代器
既是输入迭代器又是输出迭代器,并且可以对序列进行单向的遍历
双向迭代器
与前向迭代器相似,但是在两个方向上都可以对数据遍历
随机访问迭代器
也是双向迭代器,但能够在序列中的任意两个位置之间进行跳转。
6、算法:标准模板库中包括了70多个算法,其中包括了查找算法、排序算法、消除算法、计数算法、比较算法、变换算法、置换算法和容器管理等等

算法是一种函数模板,可以分为

不可变序列算法(non-mutating algorithms),不直接修改所操作的容器内容的算法
可变序列算法(mutating algorithms),可以修改它们所操作的容器的元素。
排序相关算法和数值算法
例6-1,应用不可变序列算法对数据序列进行分析
例6-2,以可变序列算法对数据序列进行复制,生成,删除,替换,倒序,旋转等可变性操作。
例6-3,应用排序相关算法对序列进行各项操作
例6-4,应用数值算法对数据序列进行操作

//6-1.cpp
#include <iostream>
#include <algorithm>
#include <functional>
#include <vector>
using namespace std;

int main()
{
 int iarray[]={0,1,2,3,4,5,6,6,6,7,8};
 vector<int> ivector(iarray,iarray+sizeof(iarray)/sizeof(int));
 int iarray1[]={6,6};
 vector<int> ivector1(iarray1,iarray1+sizeof(iarray1)/sizeof(int));  
 int iarray2[]={5,6};
 vector<int> ivector2(iarray2,iarray2+sizeof(iarray2)/sizeof(int));
 int iarray3[]={0,1,2,3,4,5,7,7,7,9,7};
 vector<int> ivector3(iarray3,iarray3+sizeof(iarray3)/sizeof(int));

 //找出ivector之中相邻元素值相等的第一个元素
 cout<<*adjacent_find(ivector.begin(),ivector.end())<<endl;

 //找出ivector之中元素值为6的元素个数
 cout<<count(ivector.begin(),ivector.end(),6)<<endl;

 //找出ivector之中小于7的元素个数
 cout<<count_if(ivector.begin(),ivector.end(),bind2nd(less<int>(),7))<<endl;

 //找出ivector之中元素值为4的第一个元素所在位置的元素
 cout<<*find(ivector.begin(),ivector.end(),4)<<endl;

 //找出ivector之中大于2的第一个元素所在位置的元素
 cout<<*find_if(ivector.begin(),ivector.end(),bind2nd(greater<int>(),2))
<<endl;
 
 //找出ivector之中子序列ivector1所出现的最后一个位置,再往后3个位置的元素
 cout<<*(find_end(ivector.begin(),ivector.end(),ivector1.begin(),
ivector1.end())+3)<<endl;

 //找出ivector之中子序列ivector1所出现的第一个位置,再往后3个位置的元素
 cout<<*(find_first_of(ivector.begin(),ivector.end(),ivector1.begin(),
ivector1.end())+3)<<endl;
 
 //子序列ivector2在ivector中出现的起点位置元素
 cout<<*search(ivector.begin(),ivector.end(),ivector2.begin(),ivector2.end())
<<endl;

 //查找连续出现3个6的起点位置元素
 cout<<*search_n(ivector.begin(),ivector.end(),3,6,equal_to<int>())<<endl;

 //判断两个区间ivector和ivector3相等否(0为假,1为真)
cout << equal(ivector.begin(), ivector.end(), ivector3.begin()) << endl;

 //查找区间ivector3在ivector中不匹配点的位置
pair<int*,int*>result=mismatch(ivector.begin(),ivector.end(),ivector3.begin());
cout<< result.first - ivector.begin() << endl;
}
//6-2.cpp
#include <iostream>
#include <algorithm>
#include <functional>
#include <vector>
using namespace std;

class even_by_two{             //类定义形式的函数对象
public:
 int operator()() const
 {return _x+=2;}
private:
 static int _x;
};
int even_by_two::_x=0;       //静态数据成员初始化

int main()
{
 int iarray[]={0,1,2,3,4,5,6,6,6,7,8};
 int iarray1[]={0,1,2,3,4,4,5,5,6,6,6,6,6,7,8};
 vector<int> ivector(iarray,iarray+sizeof(iarray)/sizeof(int));
 vector<int> ivector1(iarray+6,iarray+8);  
 vector<int> ivector2(iarray1,iarray1+sizeof(iarray1)/sizeof(int));
 ostream_iterator< int > output( cout, " " );  //定义流迭代器用于输出数据
 
 //迭代遍历ivector1区间,对每一个元素进行even_by_two操作
    generate(ivector1.begin(),ivector1.end(),even_by_two());
 copy(ivector1.begin(),ivector1.end(),output);
 cout<<endl;

 //迭代遍历ivector的指定区间(起点和长度),对每一个元素进行even_by_two操作
    generate_n(ivector.begin(),3,even_by_two());
 copy(ivector.begin(),ivector.end(),output);
 cout<<endl;

 //删除元素6
    remove(ivector.begin(),ivector.end(),6);
 copy(ivector.begin(),ivector.end(),output);
 cout<<endl;
 
 //删除(实际并未从原序列中删除)元素6,结果置于另一个区间
    vector<int> ivector3(12);
 remove_copy(ivector.begin(),ivector.end(),ivector3.begin(),6);
 copy(ivector3.begin(),ivector3.end(),output);
 cout<<endl;

 //删除(实际并未从原序列中删除)小于6的元素
 remove_if(ivector.begin(),ivector.end(),bind2nd(less<int>(),6));
 copy(ivector.begin(),ivector.end(),output);
 cout<<endl;
 
 //删除(实际并未从原序列中删除)小于7的元素,结果置于另一个区间,
 remove_copy_if(ivector.begin(),ivector.end(),ivector3.begin(),
bind2nd(less<int>(),7));
 copy(ivector3.begin(),ivector3.end(),output);
 cout<<endl;
 
 //将所有的元素值6,改为元素值3
 replace(ivector.begin(),ivector.end(),6,3);
 copy(ivector.begin(),ivector.end(),output);
 cout<<endl;
 
 //将所有的元素值3,改为元素值5,结果放置到另一个区间
 replace_copy(ivector.begin(),ivector.end(),ivector3.begin(),3,5);
 copy(ivector3.begin(),ivector3.end(),output);
 cout<<endl;
 
 //将所有小于5的元素值,改为元素值2
 replace_if(ivector.begin(),ivector.end(),bind2nd(less<int>(),5),2);
 copy(ivector.begin(),ivector.end(),output);
 cout<<endl;
 
 //将所有的元素值8,改为元素值9,结果放置到另一个区间
 replace_copy_if(ivector.begin(),ivector.end(),ivector3.begin(),
bind2nd(equal_to<int>(),8),9);
 copy(ivector3.begin(),ivector3.end(),output);
 cout<<endl;
 
 //逆向重排每一个元素
 reverse(ivector.begin(),ivector.end());
 copy(ivector.begin(),ivector.end(),output);
 cout<<endl;
 
 //逆向重排每一个元素,结果置于另一个区间
 reverse_copy(ivector.begin(),ivector.end(),ivector3.begin());
 copy(ivector3.begin(),ivector3.end(),output);
 cout<<endl;
 
 //旋转(互换元素)[first,middle), 和[middle,end)
 rotate(ivector.begin(),ivector.begin()+4,ivector.end());
 copy(ivector.begin(),ivector.end(),output);
 cout<<endl;
 
 //旋转(互换元素)[first,middle], 和[middle,end],结果置于另一个区间,
 rotate_copy(ivector.begin(),ivector.begin()+5,ivector.end(),
ivector3.begin());
 copy(ivector3.begin(),ivector3.end(),output);
 cout<<endl;
}

//6-3.cpp
#include <iostream>
#include <algorithm>
#include <functional>
#include <vector>
using namespace std;

int main()
{
 int iarray[]={26,17,15,22,23,33,32,40};
 vector<int> ivector(iarray,iarray+sizeof(iarray)/sizeof(int));
 
 // 查找并输出最大、最小值元素
 cout<<*max_element(ivector.begin(),ivector.end())<<endl;
 cout<<*min_element(ivector.begin(),ivector.end())<<endl;

 //将ivector.begin()+4-ivector.begin()各元素排序,
 //放进[ivector.begin(),ivector.begin()+4]区间。剩余元素不保证维持原来相对次序
 partial_sort(ivector.begin(),ivector.begin()+3,ivector.end());
 copy(ivector.begin(),ivector.end(),ostream_iterator<int>(cout," "));
 cout<<endl;

 //局部排序并复制到别处
 vector<int> ivector1(5);
 partial_sort_copy(ivector.begin(),ivector.end(),ivector1.begin(),
ivector1.end());
 copy(ivector1.begin(),ivector1.end(),ostream_iterator<int>(cout," "));
 cout<<endl;

 //排序,缺省为递增。
 sort(ivector.begin(),ivector.end());
 copy(ivector.begin(),ivector.end(),ostream_iterator<int>(cout," "));
 cout<<endl;

 //将指定元素插入到区间内不影响区间原来排序的最低、最高位置
 cout<<*lower_bound(ivector.begin(),ivector.end(),24)<<endl;
 cout<<*upper_bound(ivector.begin(),ivector.end(),24)<<endl;

 //对于有序区间,可以用二分查找方法寻找某个元素
    cout<<binary_search(ivector.begin(),ivector.end(),33)<<endl;
    cout<<binary_search(ivector.begin(),ivector.end(),34)<<endl;

 //下一个排列组合
 next_permutation(ivector.begin(),ivector.end());
 copy(ivector.begin(),ivector.end(),ostream_iterator<int>(cout," "));
 cout<<endl;

 //上一个排列组合
 prev_permutation(ivector.begin(),ivector.end());
 copy(ivector.begin(),ivector.end(),ostream_iterator<int>(cout," "));
 cout<<endl;

 //合并两个序列ivector和ivector1,并将结果放到ivector2中
 vector<int> ivector2(13);
 merge(ivector.begin(),ivector.end(),ivector1.begin(),ivector1.end(),
ivector2.begin());
 copy(ivector2.begin(),ivector2.end(),ostream_iterator<int>(cout," "));
 cout<<endl;

 //将小于*(ivector.begin()+5)的元素放置在该元素之左
 //其余置于该元素之右。不保证维持原有的相对位置
 nth_element(ivector2.begin(),ivector2.begin()+5,ivector2.end());
 copy(ivector2.begin(),ivector2.end(),ostream_iterator<int>(cout," "));
 cout<<endl;

 //排序,并保持原来相对位置
 stable_sort(ivector2.begin(),ivector2.end());
 copy(ivector2.begin(),ivector2.end(),ostream_iterator<int>(cout," "));
 cout<<endl;

 //针对一个有序区间,找出其中一个子区间,其中每个元素都与某特定元素值相同
 pair<vector<int>::iterator,vector<int>::iterator> pairIte;
 pairIte=equal_range(ivector2.begin(),ivector2.end(),22);
 cout<<*(pairIte.first)<<endl;
 cout<<*(pairIte.second)<<endl;

 //合并两个有序序列,然后就地替换
 int iarray3[] = { 1, 3, 5, 7, 2, 4, 6, 8 };
 vector<int> ivector3(iarray3,iarray3+sizeof(iarray3)/sizeof(int));
 inplace_merge(ivector3.begin(), ivector3.begin()+ 4, ivector3.end());
 copy(ivector3.begin(),ivector3.end(), ostream_iterator<int>(cout, " ")); 
 cout<<endl;
 
 //以字典顺序比较序列ivector3和ivector4
 int iarray4[] = { 1, 3, 5, 7,1, 5, 9, 3 };
 vector<int> ivector4(iarray4,iarray4+sizeof(iarray4)/sizeof(int));
 cout<< lexicographical_compare(ivector3.begin(),ivector3.end(),
ivector4.begin(),ivector4.end()) << endl;
}
//6-4.cpp
#include <iostream>
#include <numeric>
#include <functional>
#include <vector>
using namespace std;

int main()
{
 int iarray[]={1,2,3,4,5};
 vector<int> ivector(iarray,iarray+sizeof(iarray)/sizeof(int));

 //元素的累计
 cout<<accumulate(ivector.begin(),ivector.end(),0)<<endl;
 //向量的内积
 cout<<inner_product(ivector.begin(),ivector.end(),ivector.begin(),10)<<endl;
 //向量容器中元素局部求和
 partial_sum(ivector.begin(),ivector.end(),ostream_iterator<int>(cout," "));
 cout<<endl;
 //向量容器中相邻元素的差值
 adjacent_difference(ivector.begin(),ivector.end(),
ostream_iterator<int>(cout," "));
 cout<<endl;
}
7、函数对象:一个行为类似于函数的对象,它可以没有参数,也可以带有若干参数,其功能是获取一个值,或者改变操作的状态。任何普通的函数和任何重载了调用运算符operate()的类的对象都满足函数对象的特征,STL中也定义了一些标准的函数对象,如果以功能划分,可以分为算术运算、关系运算、逻辑运算三大类。为了调用这些标准函数对象,需要包含头文件<functional>。

C++——标准模板库的更多相关文章

  1. STL标准模板库(简介)

    标准模板库(STL,Standard Template Library)是C++标准库的重要组成部分,包含了诸多在计算机科学领域里所常见的基本数据结构和基本算法,为广大C++程序员提供了一个可扩展的应 ...

  2. 【转】C++标准库和标准模板库

    C++强大的功能来源于其丰富的类库及库函数资源.C++标准库的内容总共在50个标准头文件中定义.在C++开发中,要尽可能地利用标准库完成.这样做的直接好处包括:(1)成本:已经作为标准提供,何苦再花费 ...

  3. STL标准模板库介绍

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

  4. 【c++】标准模板库STL入门简介与常见用法

    一.STL简介 1.什么是STL STL(Standard Template Library)标准模板库,主要由容器.迭代器.算法.函数对象.内存分配器和适配器六大部分组成.STL已是标准C++的一部 ...

  5. C++——string类和标准模板库

    一.string类 1.构造函数 string实际上是basic_string<char>的一个typedef,同时省略了与内存管理相关的参数.size_type是一个依赖于实现的整型,是 ...

  6. STL 简介,标准模板库

    这篇文章是关于C++语言的一个新的扩展--标准模板库的(Standard Template Library),也叫STL.  当我第一次打算写一篇关于STL的文章的时候,我不得不承认我当时低估了这个话 ...

  7. 标准模板库(STL)学习探究之stack

    标准模板库(STL)学习探究之stack queue priority_queue list map/multimap dequeue string

  8. 标准模板库(STL)学习探究之vector容器

    标准模板库(STL)学习探究之vector容器  C++ Vectors vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库.vector之所以被 ...

  9. STL学习一:标准模板库理论基础

    STL(Standard Template Library,标准模板库)是惠普实验室开发的一系列软件的统称.现然主要出现在C++中,但在被引入C++之前该技术就已经存在了很长的一段时间. STL的从广 ...

  10. STL学习系列一:STL(标准模板库)理论基础

    STL(Standard Template Library,标准模板库)是惠普实验室开发的一系列软件的统称.现然主要出现在C++中,但在被引入C++之前该技术就已经存在了很长的一段时间. STL的从广 ...

随机推荐

  1. SAP 序列号与库存关联起来?

    SAP 序列号与库存关联起来? SAP系统标准功能可以实现序列号管理.其系统配置也不复杂,但是不少企业却使用不起来.笔者参与的诸多项目里,只有现在所在的项目里有启用序列号管理.基于项目客户所在行业,以 ...

  2. 微信小程序入门笔记-使用云开发(4)

    1.云数据库 一.介绍 云开发提供了一个 JSON 数据库,顾名思义,数据库中的每条记录都是一个 JSON 格式的对象.一个数据库可以有多个集合(相当于关系型数据中的表),集合可看做一个 JSON 数 ...

  3. Linux nohup不输出日志文件的方法

    引用:https://blog.csdn.net/guotao15285007494/article/details/84136234 最近在Linux上部署视频流推送应用时,由于网络不稳定等原因程序 ...

  4. 什么是AOP面向切面编程思想

    一.什么是AOP? 1.AOP不是一种语言,是一种编程范式 常见的编程范式: 面向过程.面向对象.函数式编程.事件驱动编程等 2.AOP可以解决特定问题,不能解决所有问题. 3.是面向对象的补充,不是 ...

  5. BigDecimal精确计算工具类

    前言 在实际开发中,遇到例如货币,统计等商业计算的时候,一般需要采用java.math.BigDecimal类来进行精确计算.而这类操作通常都是可预知的,也就是通用的.所以,写了个工具类来方便以后的工 ...

  6. oracle数据泵导入导出部分用户

    问题描述:需要将140服务器中的tbomnew实例下的部分用户导入到118服务器下的tbompx实例中,本次导入导出的两个数据库均为19C 部分用户名:CORE,MSTDATA,BOMMGMT,CFG ...

  7. linux系统下apache服务的启动、停止、重启命令

    本文章简单的介绍了关于linux下在利用命令来操作apache的基本操作如启动.停止.重启等操作,对入门者不错的选择.本文假设你的apahce安装目录为 usr local apache2,这些方法适 ...

  8. 蓝眼睛与红眼睛(The blue-eyed islanders puzzle)

    澳大利亚的华裔数学神童陶哲轩曾在网上贴出来一个问题 The blue-eyed islanders puzzle 让大家思考,逗大家玩儿. 说一个岛上有100个人,其中有5个红眼睛,95个蓝眼睛.这个 ...

  9. 为什么我用Ipad Pro做电子笔记和看PDF电子书

    为什么我用Ipad Pro做电子笔记和看PDF电子书 Ipad做笔记的优点: 1.ipad整理的笔记可以随时修改,可以看PDF的书,2.纸质书很重携带不便3.ipad的可通过关键词搜索笔记内容 4.笔 ...

  10. 使用jdbc实现ActiveMQ持久化

    步骤一:创建一个数据库 步骤二:配置activemq.xml配置文件 1.在persistenceAdapter加入如下配置 <!--createTablesOnStartup 启动是否创建表 ...