概述
基础知识点:
|STL是C++标准程序库的核心,深刻影响了标准程序库的整体结构;
|STL构成为可适应不同需求的集合类和在这些数据集合上操作的算法;
|STL内的所有组件有模板构成,其元素可以是任意类型;
|所有C++编译器和所有操作系统都支持STL;
|STL组件为容器、迭代器、算法三部分构成;
容器为管理某类对象的集合;
迭代器为在对象集合(容器)上进行遍历;
算法为处理集合内的元素;
|容器类别:
序列式容器:排列次序取决于插入时机和位置;
关联式容器:排列顺序取决于特定准则;
STL容器的共同操作:
{
|初始化:
产生一个空容器:
std::list<int>l;
以另一个元素为初值完成初始化:
std::list<int>l;
...
std::vector<float>c(l.begin(),l.end());
以数组元素为初值完成初始化:
int array[]={2,4,6};
...
std::set<int>c(array,array+sizeof(array)/sizeof(array[0]));
|与大小相关的操作:
size():返回当前容器的元素数;
empty():判断容器是否为空;
max_size():返回容器能容纳的最大元素数量;
|比较:
==、!=、<、<=、>、>=
比较操作两端的容器必须属于同一类型;
如果俩个容器内的所有元素按序相等,那么这俩个容器相等;
采用字典式顺序判断某个容器是否小于另一个容器;
|赋值和交换:
swap用于提高赋值交换操作效率;
|与迭代器相关的操作:
begin():返回一个迭代器,指向一个元素;
end():返回一个迭代器,指向最后一个元素之后;
rbegin():返回一个逆向迭代器,指向逆向遍历的第一个元素;
rend():返回一个逆向迭代器,指向逆向遍历的最后一个元素之后;
|元素操作:
insert(pos,e):将元素e的拷贝安插于迭代器pos所指的位置;
erase(beg,end):移除[beg,end]区间内的所有元素;
clear():移除所有元素;
}
迭代器:
{
|可遍历容器内全部或部分元素的对象;
|指出容器中的一个特定位置;
|迭代器的基本操作:
*:返回当前位置上的元素值,若该元素有成员,可通过迭代器以operator->取用;
++:将迭代器前进至下一元素;
==、!=:判断俩个迭代器是否指向同一位置;
=:为迭代器赋值;
|所有容器都提供获得迭代器的函数;
半开区间[beg,end)的好处:
1、为遍历元素时循环的结束时机提供了简单的判断依据(只要为达到end()循环就可以继续);
2、不必对空区间采取特殊处理;
|所有容器都提供俩种迭代器
container::iterator以“读写”元素遍历元素;
container::const_iterator以“只读模式”遍历元素;
|迭代器分类:
双向迭代器:
可以双向行进,以递增运算前进,或以递减运算后退,可以用==和!=比较;
list、set和map提供双向迭代器;
list<int>l;
for(pos=l.begin();pos!=l.end();++pos
{..}
|随机存取迭代器
除了具备双向迭代器的所有属性还具备随机访问能力;
可以对迭代器增加或者减少一个偏移量,处理迭代器之间的距离;
vector、deque和string提供随机存取迭代器;
}
map/multimap
|构造拷贝析构:
map c:产生新的map;
map c1(c2):产生同类型的c1,并复制c2的所有元素;
map c(op):以op为排序准则产生一个新的map;
map c(beg,end):以区间[beg,end],内的元素产生一个map;
map c[beg,end,op]:以op为排序准则,以区间[beg,end]中的元素产生一个map;
~map():销毁所有元素并释放内存;
|map可以为以下形式:
map<key,value>是一个以<为排序准则的map;
map<key,value,op>一个以op为排序准则的map;
|非变动操作:
c.size()返回元素的个数;
c.empty()判断容器是否为空;
c.max_size()返回元素最大可能数量;
c1==c2判断二者是否相等;
c1!=c2判断二者是否不相等;
c1<c2判断是否小于;
c1>c2判断是否大于;
c1<=c2;c1>=c2;同上;
|赋值
c1=c2;将c2的全部元素赋值给c1;
c1.swap(c2);c1、c2的元素互换;
swap(c1,c2);同上,全局函数;
|特殊搜索操作:
count(key);返回键值等于key的元素个数;
find(key);返回键值等于key的第一个元素,找不到的话返回end;
lower_bound(key)返回键值大于等于key的第一个元素;
upper_bound(key)返回键值大于key的第一个元素;
equal_range(key)返回键值等于key的元素区间;
map实例:
#include <iostream>
#include <map>
#include <algorithm>
using namespace std;
struct T1
{
int v;
bool operator <(const T1 &a)const
{
return (v <a.v);
}
};
struct T2
{
int v;
};
struct cmp
{
bool operator () (const T2 &a, const T2&b)const
{
return (a.v <b.v);
}
};
int main()
{
map<T1,int>mt1;
map<T2, int,cmp>mt2;
map<string,int> m2;
map<string,int>::iterator m2i, p1, p2;
//map<string, int,greater<string> >m2;//greater<string>默认小大排序
//map<string, int,greater<string> >::iterator m2i, p1, p2;//迭代器
m2["abd"] =2;
m2["abc"] =1;
m2["cba"] =2;
m2.insert(make_pair("aaa", 9));
//make_pair 属于算法的内容,将两盒数组合成整体
m2["abf"] =4;
m2["abe"] =2;
cout <<m2["abc"] << endl;
m2i=m2.find("cba");
if(m2i != m2.end())
{
cout <<m2i->first << ": " <<m2i->second << endl;
}
else
{
cout <<"find nothing" << endl;
}
cout <<"Iterate" << endl;
for(m2i = m2.begin();m2i != m2.end(); m2i++)
{
cout <<m2i->first << ": " <<m2i->second << endl;
}
return 0;
}
multimap实例:
#include <iostream>
#include <map>
#include <algorithm>
using namespace std;
int main()
{
multimap<string,int> mm1;
multimap<string,int>::iterator mm1i, p1, p2;
mm1.insert(make_pair("b", 3));
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;//b 的个数
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;
}
return 0;
}
学习心得:
STL具有高可重用性,高通用性,跨平台等优点,并且其内包含了些许多经典算法,适用于多种类型的数据,其为程序开发提供了许多宝贵的“零件”,方便了软件的开发,使得代码大大简化,功能强大并大幅度提升了效率,而不用耗费太多精力放在算法上,确实方便了编程操作。
其中迭代器将算法与容器联系起来,为容器中的元素分配储存空间,为算法执行期间产生的对象提供机制。
虽然上述部分,对于初学者而言 ,有些抽象,且难以理解,但相信通过丰富实践后,最后定能运用得行云流水,得心应手,对C++有更深刻地掌握。
最后
以上就是有魅力奇迹为你收集整理的STL学习总结的全部内容,希望文章能够帮你解决STL学习总结所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复