STL标准模板库
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
STL标准模板库(standard template library)
容器类(可以存储其他对象的对象),算法(一系列封装好的函数),迭代器(用于遍历操作的类)
容器可以直接存储对象,也可以存储对象的指针。
成熟的程序员喜欢使用间接存储。
容器主要包括两种类型:序列类(一般是线形存储)和关联类(一般是非线性存储)。
一、序列式容器
vector ----- 数组可变长不提供pop_front()删除头元素的函数
list ----- 链表
(1)Vector v[1000]当越界的时候,会出现段错误
使用vector需要导入头文件vector
v.at(1000) 越界的时候,会抛出out_of_range的异常,在程序中捕获
v.size() 返回长度,可利用这个循环迭代
v.empty()判断容器是否为空
iterator迭代器:可以做取*操作*iterator
iter->name <=> (*iter).name
iter++
v.begin() 指向数组的开始
v.end() 指向数组最后一个元素的后面,是一个结束标志
如:对一个vector进行迭代输出
vector<int> v1;
v1.push_back(1);//假设添加了很多int元素
vector<int>::iterator it; //iterator是vector的一个内部类,要标识出迭代器类型for( it = v1.begin(); it < v1.end(); it++ )
cout << *it << endl;
v.insert(iter,5); //在iter所指的元素前面插入5
v.insert(iter,5,100); //在iter所指的元素前插入5个100
这样的插入操作,会造成原来的iterator失效,对起重新赋值,可以保证继续使用(2)list
使用list需要导入头文件list
不能做at()
多了push_front(),pop_front()
iter不能做加n操作
使用于做频繁的插入删除操作
二、关联式容器
(1)map
使用map需要导入头文件map
适合根据键查找值的操作
存储上按照键值排序,并且key值唯一
map<int,Student> m;
Student s1( 1 ,"lily" );
//创建一个pair,并存到map的第一个位置中,value_type是map的静态函数
m.insert( map<int,Student>::value_type(s.getId(),s1)) ;
Student s2( 4, "licy”);
m.insert( map<int,Student>::value_type(s2.getId(),s)) ;
map<int,Student>::iterator it ;
for(it=m.begin();it!=m.end();it++ ){
cout<< it->first << " "<<it->second;
cout<<endl ;
}
在map中用[]查询,并不安全
m.find(1); // 查询key为1的value
返回一个iter,指向找到的那个键值对,如果没找到,iter会与iter.end()的值相等(2)multimap
其中的key允许重复
使用multimap需要导入头文件multimap,没有头文件multimap
查找:multimap<int ,Student>::iterator it ;
multimap<int ,Student>::iterator lt ;
multimap<int ,Student>::iterator ut ;
lt = m.lower_bound( 1 );
ut = m.upper_bound( 1 );
for( it=lt ; it != ut ; it++ ){
cout<<it->first <<" " ;
cout<<it->second <<endl;
}
(3)set
使用set需要导入头文件set
set中不能插入重复数据,相当于map中的key
插入数据的时候不必指定位置
因为与map中的key一致,仍保留着排序的特性
(4)multiset
使用set需要导入头文件set,没有头文件multiset
允许重复,与vector类似,唯一不同的就是保留着排序的特性
三、容器补充说明
容器共同的特征:
1. 构造函数(无参)
2. 析构函数
3. 赋值运算符重载
4. 比较运算符重载> < >= <= == !=
5. 插入函数insert(pos(位置),elem)
6. 删除函数:erase(pos)和erase(begin p,end p),用来删除容器中的一个或多个元素,其中pos是要删除元素的位置,begin p和end p则指一个区间。
7. 四个迭代器相关的函数,begin()和end()返回指向容器中第一个元素的迭代器和指向最后一个元素之后的迭代器,二rbegin()和end()则返回的是指向最后一个元素的返回迭代器和指向第一个元素之前的反向迭代器。
8. 部分相关函数,max_size()返回流类,容器中最多能存放的元素个数,size()返回容器中当前存放的元素个数,empty()返回容器中当前是否为空。
9. 消除函数,clear(),删除容器中的所有元素,释放相应的资源
10. 交换函数,都支持一个成员函数swap()和一个全局函数swap(),来两个容器的内容交换。
序列式容器
特点:都是有序的,线性Vector List deque
Vector中的成员函数:
[]按下标取元素
font()取第一个元素
back()取最后一个元素
at()比较安全的[],能刨除out_or_rang异常
insert()在给定的维护子插入一个或多个元素
pop_back()删除最后一个元素
erase()删除一个或多个元素
在使用back()和insert的时候才会自动增长
在使用[]和at()的时候必须保证下标不越界,否则前者的结果不确定,后者抛出异常。
List中的成员函数:
psh_front()在列表头增加元素
pop_front()在列表头删除元素
push_back()在列表尾部增加元素
pop_back()在列表尾部删除元素
list 可以双向增长,适合对于元素频繁的插入与删除的应用
unique()用来删除相邻的重复元素
sort()函数用来对所有的元素进行排序(默认为升序)
rerse()函数把元素的顺序颠倒过来
splice()函数把另一个list容器中元素转移到制定位置
remove()函数删除所有值为指定值的元素
不支持[]元素符以及at()函数
关联式容器:map(key,value)
使用make_pair和value_type函数模板去行成key-value关系
使用:
map<string,student> softclass
student jack(“jack”,20);
softclass[“jack”]=jack
student lisa=softclass[“lisa”]
////也可以使用迭代
map<string,student>::const_iterator
ci=softclass.begin();
cout<<ci->first;//print key
coutMMci->second;//print student object
map<char*,int> im;
im.insert(map<char*,int>::value_type(“ABC”,100));
im.insert(map<char*,int>::value_type(“XYZ”,100));
map<char*,int>::const_iterator mp=im.begin();
while(mp!=im.end()){
cout<<mp->first<<”---“<<mp->second<<endl;
mp++;
}
find()函数可以找到指定的key的位置
map的迭代器有两个成员first是key,second 是value可以用->运算符访问。
count()函数可以统计容器中指定key的个数。
0表示不存在,1表示存在
multmap(允许重复的key)可以超过1
如果想知道指定key的每一个元素的位置,可以用lower_bound()函数和upper_bound()函数分别取得能够插入这个key值的元素的第一个位置和最后一个位置。
mltimap(char*,int>im
im.insert(multimap<char*,int>::value_type("cxp",1000));
im.insert(multimap<char*,int>::value_type("cxp",2000));
multimap<char*,int>::const_iterator mp1;
multimap<char*,int>::const_iterator mp2;
imp1=im.upper_bound("cxp");
imp2=im.lower_bound("cxp");
iultimap<char*,int>::const_iterator mp;
for(mp=mp2;mp!=mp1;mp++){
cout<<mp->first<<":"<<mp->second<<endl;
}
set:一个元素就是一个唯一的key,即使插入重复的值,set将只保存一份
与map相似,但只有key没有value
set<int> is;
is.insert(1);
is.insert(2);
set<int>::const_iterator sp=is.bgein();
for(;sp!=is.end();sp++){
cout<<*sp<<endl;
}
multiset本质上是允许重复值的set
multiset<int> ims;
ims.insert(1);
ims.insert(1);
multiset<int>::conset_iterator msp=ims.begin()
for(;msp!=ims.end();msp++){
cout<<*msp<<endl;
}
C++中定义了四种迭代器,根据指针移动方向和类型分为四种
1. iterator 向前迭代next 也叫正向迭代
2. reverse_iterator 向后迭代也叫反向迭代
3. const_iterator 常量迭代器
4. const_reverse_iterator 常量反向迭代器。