【C++】 STL详解
泛型编程
- 将程序写得尽可能通用
- 将算法从特定的数据结构中抽象出来,成为通用的
- C++的模板为泛型程序设计奠定了关键的基础
什么是STL
STL(Standard Template Library),即标准模板库,是一个高效的C++程序库
被容纳于C++标准程序库(C++ Standard Library)中,是ANSI/ISO C++标准中最新的也是极具革命性的一部分
包含了诸多在计算机科学领域里常用的基本数据结构和基本算法。为广大C++程序员们提供了一个可扩展的应用框架,高度体现了软件的可复用性
从逻辑层次来看,在STL中体现了泛型化程序设计的思想(generic programming)
在这种思想里,大部分基本算法被抽象,被泛化,独立于与之对应的数据结构,用于以相同或相近的方式处理各种不同情形
从实现层次看,整个STL是以一种类型参数化(type parameterized)的方式实现的
基于模板(template)
STL发展
1971 : David R. Musser 开始倡导Generic Programming 概念
1979 : Alexander Stepanov 创造STL
1987 : Alex 和Musser 开发出一套Ada library
??? : Alex 先后在AT&T 及HP实验室以C 及C++实验大量的体系结构和算法形式。
1992 : Meng Lee 加入称为另一位主要贡献者
1993/11 : Alex 于ANSI/ISO C++ 会议展示
1994 夏: STL 被纳入C++标准
STL组件
Container(容器) 各种基本数据结构
Adapter(适配器) 可改变containers或function object接口的一种组件
Algorithm(算法) 各种基本算法如sort、search…等
Iterator(迭代器)* 连接containers和algorithms
Function object(函数对象) *
Allocator(分配器)*
容器容器类是容纳、包含一组元素或元素集合的对象
异类容器类与同类容器类
顺序容器与关联容器
七种基本容器:向量(vector)、双端队列(deque)、链表(list)、集合(set)、多重集合(multiset)、映射(map)和多重映射(multimap)
标准容器的成员绝大部分都具有共同的名称
适配器
适配器是一种接口类
为已有的类提供新的接口
目的是简化、约束、使之安全、隐藏或者改变被修改类提供的服务集合
三种类型的适配器:
容器适配器:用来扩展7种基本容器,它们和顺序容器相结合构成栈、队列和优先队列容器
迭代器适配器
函数对象适配器
迭代器
迭代器是面向对象版本的指针,它们提供了访问容器、序列中每个元素的方法
算法
C++标准模板库中包括70多个算法
其中包括查找算法,排序算法,消除算法,记数算法,比较算法,变换算法,置换算法和容器管理等等
这些算法的一个最重要的特性就是它们的统一性,并且可以广泛用于不同的对象和内置的数据类型
顺序容器
顺序容器的接口
插入方法
push_front(),push_back(),insert(),运算符“=”
删除方法
pop() ,erase(),clear()
迭代访问方法
使用迭代器
其他顺序容器访问方法(不修改访问方法)
front(),back(),下标[]运算符
向量 vector
-
向量属于顺序容器,用于容纳不定长线性序列(即线性群体),提供对序列的快速随机访问(也称直接访问)
-
数据结构很像一个数组,所以与其他容器相比,vector 能非常方便和高效访问单个元素,支持随机访问迭代子
-
向量是动态结构,它的大小不固定,可以在程序运行时增加或减少
与数组不同,向量的内存用尽时,向量自动分配更大的连续内存区,将原先的元素复制到新的内存区,并释放旧的内存区;这是向量类的优点
头文件:#include
vector 基本操作
(1)头文件
#include
(2)创建vector对象
vector vec;
(3)尾部插入数字
vec.push_back(a);
(4)使用下标访问元素
cout<<vec[0]<<endl;记住下标是从0开始的
(5)使用迭代器访问元素
vector::iterator it;
for(it=vec.begin();it!=vec.end();it++)
cout<<*it<<endl;
(6)插入元素
vec.insert(vec.begin()+i,a);在第i+1个元素前面插入a;
(7)删除元素
vec.erase(vec.begin()+2);删除第3个元素
vec.erase(vec.begin()+i,vec.end()+j);删除区间[i,j-1];区间从0开始
(8)向量大小
vec.size();
vec.resize;改变大小
(9)清空
vec.clear();
例如
#include <iostream>
#include <iomanip>
#include <vector> //包含向量容器头文件
using namespace std ;
void main(){
vector<int> A(10); //创建vector对象
int n;
int primecount = 0, i, j;
cout<<"Enter a value>=2 as upper limit: ";
cin >> n;
A[primecount++] = 2;//下标法访问元素
for(i = 3; i < n; i++){
if (primecount == A.size())
A.resize(primecount + 10); //改变容器大小
if (i % 2 == 0)
continue;
j = 3;
while (j <= i/2 && i % j != 0)
j += 2;
if (j > i/2) A[primecount++] = i;
}
for (i = 0; i<primecount; i++){//输出质数
cout<<setw(5)<<A[i];
if ((i+1) % 10 == 0) //每输出10个数换行一次
cout << endl;
}
cout<<endl;
}

571

被折叠的 条评论
为什么被折叠?



