STL详解

【C++】 STL详解

泛型编程

  1. 将程序写得尽可能通用
  2. 将算法从特定的数据结构中抽象出来,成为通用的
  3. 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

  1. 向量属于顺序容器,用于容纳不定长线性序列(即线性群体),提供对序列的快速随机访问(也称直接访问)

  2. 数据结构很像一个数组,所以与其他容器相比,vector 能非常方便和高效访问单个元素,支持随机访问迭代子

  3. 向量是动态结构,它的大小不固定,可以在程序运行时增加或减少

    与数组不同,向量的内存用尽时,向量自动分配更大的连续内存区,将原先的元素复制到新的内存区,并释放旧的内存区;这是向量类的优点

头文件:#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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值