STL_导图(C++)

Stl讲解

1 泛型程序设计

      泛型 =》通用性。

在 C++ 中,模板是泛型编程的基础。

2体验stl运行流程参考:stl初体验代码

3迭代器

1.迭代器是一种设计思想。

2.iterator模式访问容器内元素,可以在不暴露容器内部元素的实现的前提下访问容器内的每个元素。

3.迭代器和指针的区别:

   指针中有地址,可以打印,但迭代器中无地址,不能打印地址。

迭代器是泛化的指针,可以用++ -- * ->等运算符。

   指针相减会得到一个地址,迭代器相减,得到间隔index的数量,即距离。

4.两迭代器表示数据区间[iter1, iter2),左闭右开,算法中也是左闭右开表示,

      iter1 == iter2,区间取不到值,不操作。

5. vector<int> myvector;

  vector<int>::iterator iter;   //表示定义了一个用于vector<int>的迭代器。

 

类似于继承关系

 

 

示例分析:

参考并练习copy.cpp

参考并练习 输入输出流迭代器.cpp

参考并练习 输入输出流迭代器2.cpp

有关transform(),容器,迭代器,函数对象,算法,negate()

 

 

 

 

 

 

 

 

copy()用法:

 advance()

distance()

容器的分类与基本功能

 

 

vector<int>s1,s2;     //size== 0

s1 == s2;    //容器类型一致时才支持关系运算符

s1.begin()s1.end()    //s.end()迭代器指最后一个元素的下一个(实际不存在)

S1.clear()     //容器size变为0

S1.empty()   //返回bool型变量,若为空,返回1

S1.size()

S1.swap(s2) //可以和空容器交换值,交换之后自身变为空容器

  

(错误)//?????????????常迭代器:一经初始化 无法更改

正确:不可以通过常迭代器修改容器内的值,即使修改常迭代器指向的值的下一个值也不行。常迭代器的指向可以改变。(不能改变所指向的值,可以改变迭代器位置)

*(cit+1) = 99;//不可以通过常迭代器修改容器内的值;

rbegin()+1 指向倒数第二个元素。

rend()指向第一个元素的前一个(不存在)

rend()rbegin()的返回值类型为reverse_iterator,

不可以将rend()rbegin()赋值给iteration

 

顺序容器

1 顺序容器通用

n个数,t值,q迭代器(只要数据类型(比如int)相同就能使用)

//s.assign(n)=>赋值n0

 //s中已有72345 s.size() == 5

s.resize(1);      //s.size() == 1, v[0] == 7

       s.assign(1,9); //s.size()== 1, v[0] == 9

//insert,挪出p1的位置插,即原来 [p1end)开始的元素全部后移

//erase(p1) 移除p1指向的元素

返回引用,返回的不是迭代器

为容器重新分配空间,自动初始化为0;若空间减小了,保留前n

2 向量vector

//vector重载了[ ], 且具有at()

//区别于resize()
即使执行s.clear(), s.capacity()也不会减小

capacity >= size

capacity虽然会自动扩容,但使用s.reserve()进行手动扩容可以避免频繁自动扩容。

分析vector.cpp

 

 

 

 

 

参考示例代码:deque

sort(iter1, iter2); //[iter1, iter2)升序排序,sort()是可变函数

//双向非循环链表

List.cpp

 

 

 

关联容器

 

 

 

关联容器的通用操作: ( 顺序容器没有find() count() )

//find()只能查找key

//count()只能对key计数

>按key自动排序

 

最简单的关联容器:集合 set

 

 

 

 

 

 

 

分析代码 set.cpp

//注意这边的upper_bound(val),没有限定范围,一种重载。

 

set只有key,没有value

set中的元素自动按key升序排列。

pair<set<double>::iterator, bool> r;

r = s.insert(v); //s.insert(key)的返回值为pair类型。

set中的key值要唯一。如果插入key = v成功,r.first为指向刚插入的位置的迭代器,r.second值为1;如果插入失败,r.second值为0

 

 

 

 

 

 

 

分析示例代码 map.cpp

 

 

mapkeyvalue组成,其中的key不能重复。

map中的元素按key自动升序排列。

pair<map<double>::iterator, bool> r;

r = insert(make_pair(key,value)); //map中要插入二元组,用make_pair()函数来构成二元组。

如果插入key = v成功,r.first为指向刚插入的位置的迭代器,r.second值为1;如果插入失败,r.second值为0

 

 

 

 

分析代码:muitimap.cpp

 

 

 

 

分析stl初体验代码

 

分析示例:定义普通函数表示乘法.cpp:

 

 

 

 

 

 

 

 

 

 

 

分析代码 谓词.cpp:

 

 

 

 

 

 

 

 

 

 

函数适配器

 

 

 

bind1st_bind2nd.cpp

分析 not1_not2_ptr_fun.cpp

 

成员函数适配器.cpp

Men_fun : 使成员函数作为函数对象,传入指针 

men_fun_ref:使成员函数作为函数对象,传入引用

 

STL基本算法

 

参考示例:不可变算法示例分析.cpp

 

可变算法示例分析.cpp

可变算法示例分析2.cpp

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值