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)=>赋值n个0
//若s中已有7,2,3,4,5; s.size() == 5
s.resize(1); //s.size() == 1, v[0] 仍== 7;
s.assign(1,9); //s.size()== 1, v[0] == 9。
//insert,挪出p1的位置插,即原来 [p1,end)开始的元素全部后移
//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
map由key和value组成,其中的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