概述
1,STL是什么
由一些可以适应不同需求的集合类,以及在这些数据集合上操作的算法构成。
2,STL的作用
对数据更加快捷方便地进行操作。
3, STL的组成
1》容器-管理某类对象的集合,(看做是一个不指定内部元素数据类型的大类)
2》迭代器-在对象集合上进行遍历(看做是一个位置指针,+1,-1,分别指上一个或者下一个容器内的元素)
3》算法-处理集合内的对象(相当于大类内的函数,可对数据进行各种操作)
4》容器适配器,函数对象(I don't know..)
4,迭代器
1》作用:
遍历STL容器内全部或部分元素的对象
指出容器中的一个特定位置
2》基本操作:
1- * 返回当前位置上的元素值,如果该元素有成员,可以通过迭代器以operator ->取用。
2- ++ 将迭代器前进到下一元素
3- == 和 != 判断两个迭代器是否属于同一位置
4- = 为迭代器赋值(将所指元素的位置赋值过去)
3》两种迭代器:
1-container::interator以 读/写 的模式遍历元素
2-container::const_iterator以 只读 模式遍历元素
4》迭代器分类
1-双向迭代器
可以双向行进,以递增运算前进或以递减运算后退,可以用==和!=比较。
list, srt, map, 提供双向迭代器
(有单项迭代器吗? 答,有,指向forward_list的迭代器只支持++i,i++,其他的像+=,+,- -,等 都不支持。)
2-随机存储迭代器
除具有双向迭代器的所有属性外,还具有随机访问的能力。
可以对迭代器增加或者减少一个偏移量,处理迭代器之间的距离或者使用< > 之类的关系运算符比较两个迭代器。
vector,deque 和string 提供随机存储迭代器
5,vector
1》简介
1-模拟动态数组(看成一个变态的大数组类)
2-元素可以是任意类型
3-包含的头文件#include <vector>
ps:内部元素必须具备赋值和拷贝能力。
2》变态数组vector的构造,拷贝和析构
1- vector<T>c : 产生空的vector
2- vector<T>c1(c2) :产生同类型的c1,并将复制c2的所有元素
3- vector<T>c(n) : 利用类型T的默认构造函数和拷贝构造函数生成一个大小为n的vector
4- vector<T>c(n,e) : 产生一个大小为n的vector,每个元素都是e
5- vector<T>c(beg,end) : 产生一个vector,以区间[beg,end]为元素初值
6- ~vector<T>() : 销毁所有元素并释放内存。
3》其他操作:
1-c.empty() 判断容器是否为空
2- c.capacity() 返回重新分配空间前可容纳的最大元素数量
3- c.reserve(n) 扩大容量为n
4- c1= c2 将c2的全部元素赋值给c1
5- c.assign(beg,e[beg,end]nd) 将区间的元素赋值给c
6- at(idx) 返回索引idx所标识的元素的引用,进行越界检查
7- operator[](idx) 返回索引idx所标识的元素的引用,不进行越界检查
8- front() 返回第一个元素的引用,不检查元素是否存在
9- back() 返回最后一个元素的引用,不检查元素是否存在
10- c.push_back(e) 在尾部添加一个元素e的副本
11- c.pop_back() 移除最后一个元素但不返回最后一个元素
6,map/multimap
1》简介
1- 元素包含两部分(key,value),key和value可以是任意类型
2- 必须包含的头文件#include <map>
3- 根据元素的key自动对元素排序,因此根据元素的key进行定位很快,但根据元素的value定位很慢
4- 不能直接改变元素的key,可以通过operator[]直接存取元素值
5- map中不允许key相同的元素,multimap允许key相同的元素
2》构造,拷贝和析构
1- map c 产生空的map
2- mapc1(c2) 产生同类型的c1,并复制c2的所有元素
3- mapc(op) 以op为排序准则产生一个空的map
4- map c(beg,end) 以区间[beg,end]内的元素产生一个map
5- map c(beg,end,op) 以op为排序准则,以区间[beg,end]内的元素产生一个map
6- ~ map() 销毁所有元素并释放内存。
3》搜寻操作:
1- count(key) 返回”键值等于key”的元素个数
2- find(key) 返回”键值等于key”的第一个元素,找不到返回end
3- lower_bound(key) 返回”键值大于等于key”的第一个元素
4- upper_bound(key) 返回”键值大于key”的第一个元素
5- equal_range(key) 返回”键值等于key”的元素区间
7,set/multiset
1》简介:
1- 集合(Set)是一种包含已排序对象的关联容器
2- 包含的头文件#include <set>
3- map容器是键-值对的集合,好比以人名为键的地址和电话号码。相反地,set容器只是单纯的键的集合。当我们想知道某位用户是否存在时,使用set容器是最合适的。
2》其他操作:
1- equal_range() 返回集合中与给定值相等的上下限的两个迭代器
2- lower_bound() 返回指向大于(或等于)某值的第一个元素的迭代器
3- key_comp() 返回一个用于元素间值比较的函数
4- upper_bonund() 返回大于某个值元素的迭代器
5- value_comp() 返回一个用于比较元素间的值的函数
8,pair模板
用于生成key-value对
9,通用算法
1》元素操作:
1-erase(beg,end)-移除[beg,end]区间内的所有元素
2-clear()-移除所有元素
3-insert(pos,e)-将元素e的拷贝安插于迭代器pos所指的位置
2》与大小相关:
1- size()-返回当前容器的元素数量
2- empty()-判断容器是否为空
3- max_size()-返回容器能容纳的最大元素数量
3》与迭代器相关的:
1- begin()-返回一个迭代器,指向第一个元素
二,简单应用
1,迭代器
list<int> l;
for(pos=l.begin();pos!=l.end();++pos
{
…
}
或:
vector<int> v;
for(pos=v.begin();pos<v.end();++pos{
…
}
2,vector
vector<int> a;//定义一个元素类型为int,名称为a 的动态数组。
for (int i = 0; i < 5; ++i){
a.push_back(5 - i);//将5 4 3 2 1 依次放入a 里面
}
cout << "Size: " << a.size() << endl; //a当前的大小
a.pop_back(); //移除a 的最后一个元素
a[0] = 1;
cout << "Size: " << a.size() << endl;
for (int i = 0; i < (int)a.size(); ++i){
cout << a[i] << ", " << endl;
}
cout << endl;
sort(a.begin(), a.end());
cout << "Size: " << a.size() << endl;
for (int i = 0; i < (int)a.size(); ++i){
cout << a[i] << ", " << endl;
}
cout << endl;
a.clear();//清除a中所有元素
cout << "Size: " << a.size() << endl;
3,map/multimap
multimap<string, int> mm1;//定义一个索引key是string,值valua是int的,名为mm1的
multimap<string, int>::iterator mm1i, p1, p2;//定义p1,p2两个迭代器
mm1.insert(make_pair("b", 3));//make_pair,生成
mm1.insert(make_pair("a", 0));
mm1.insert(make_pair("b", 5));
mm1.insert(make_pair("c", 4));
mm1.insert(make_pair("b", 2));
cout << "Size: " << mm1.size() << endl;
for(mm1i = mm1.begin(); mm1i != mm1.end(); mm1i++)
{
cout << mm1i->first << ": " << mm1i->second << endl; }
cout << "COUNT: " << mm1.count("b") << endl;
cout << "Bound: " << endl;
p1 = mm1.lower_bound("b");
p2 = mm1.upper_bound("b");
for(mm1i = p1; mm1i != p2; mm1i++){
cout << mm1i->first << ": " << mm1i->second << endl;
}
三,学习感悟
一开始预习时没看到实例,一直看不明白,找教程找博客,不是太入门就是太复杂,讲了几个例子后,慢慢的就明白是个什么意思了。现在也刚能明白,这东西有多好用,后面还有一堆容器自带的函数,还要再记,再用,争取掌握吧。
最后
以上就是稳重灯泡为你收集整理的关于STL的学习总结的全部内容,希望文章能够帮你解决关于STL的学习总结所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复