STL的使用和背后数据结构
STL(Standard Template Library即,模板库)包括六个部分:容器(containers)、迭代器(iterators)、空间配置器(allocator)、配接器(adapters)、算法(algorithms)、仿函数(functors)
vector
1、vector:连续存储
(1)头文件,#include<vector>
(2)创建vector对象,vector<int> vec;
(3)尾部插入元素,vec.push_back(a);
(4)使用下标访问元素,cout<<vec[0]<<endl;
(5)使用迭代访问元素
vector<int>::iterator it;
for(it=vec.begin();it!=vec.end();it++)
3 cout<<(*it)<<endl;
(6)插入元素,vec.insert(vec.begin()+i,a);在第i+1个元素前面插入a
(7)删除元素,vec.erase(vec.begin()+2);删除第3个元素
vec.erase(vec.begin()+i,vec.end()+j);删除区间[i,j-1];区间从0开始
(8)向量大小,vec.size();
(9)清空,vec.clear();
vector的元素不仅仅只限于int型,int、double、string、全局结构体等都可以。
#include<iostream>
#include<vector>
using namespace std; struct Student
{
int num;
double score;
double operator< (const Student &stu) const
{
if(stu.score>score)
return stu.score;
else
return score;
}
}; int main()
{
vector<Student> stu;
//student 1
Student stu_temp;
stu_temp.num = ;
stu_temp.score =9.9;
stu.push_back(stu_temp);
//student 2
Student stu_temp1;
stu_temp1.num = ;
stu_temp1.score =8.8;
stu.push_back(stu_temp1);
//student 3
Student stu_temp2;
stu_temp2.num = ;
stu_temp2.score =7.7;
stu.push_back(stu_temp2);
//print all the students
cout<<"the number of student:"<<stu.size()<<endl;
vector<Student>::iterator it;
for(it=stu.begin();it!=stu.end();it++)
cout<<"number:"<<(*it).num<<" score:"<<(*it).score<<endl;
//delete one student
stu.erase(stu.begin()+);
cout<<endl;
cout<<"the number of student:"<<stu.size()<<endl;
for(it=stu.begin();it!=stu.end();it++)
cout<<"number:"<<(*it).num<<" score:"<<(*it).score<<endl;
//print the better score
double _result = stu_temp<stu_temp1;
cout<<endl;
cout<<"the better score:"<<_result<<endl; return ;
}
vector_sample
string
2、string
平时最常用的一个,这里就不做过多说明了
map
3、map:关联容器,提供一对一的数据映射(关键字,值);数据结构为红黑树(RB-Tree)
关键字只能在map中出现一次;另外,map内部自建一颗红黑树(一种非严格意义上的平衡二叉树),这颗树具有对数据自动排序的功能,所以在map内部所有的数据都是有序的;
(1)头文件,#include<map>;
(2)创建map对象,map<int,string> mapStudent;
(3)插入数据,
第一种:用insert函数插入pair数据
mapStudent.insert(pair<int,string>(,"Christal"));
mapStudent.insert(pair<int,string>(,"Carl"));
第二种:用insert函数插入value_type数据
mapStudent.insert(map<int,string>::value_type (,"Christal"));
mapStudent.insert(map<int,string>::value_type (,"Carl"));
第三种:用数组方式插入数据
1 mapStudent[] = "Christal";
2 mapStudent[] = "Carl";
输出均为:
如果用前两种方法插入数据,因为关键字是唯一的,所以当关键字已经存在的时候,再插入相同关键字的map是不成功的;而第三种用数组插入的方法是仍然可以的,会将原来的关键字所对应的值进行更改,相当于被覆盖掉了。
所以要想知道前两种方法的插入是否成功,应该用一个返回值来检验。
#include<iostream>
#include<string>
#include<map>
using namespace std;
int main()
{
map<int,string> mapStudent;
pair<map<int,string>::iterator,bool> insert_pairl; //insert 1 and check
insert_pairl = mapStudent.insert(pair<int,string>(,"Christal"));
if(insert_pairl.second == true)
cout<<"Insert Successfully"<<endl;
else
cout<<"Insert Failure"<<endl; //insert 2 and check
insert_pairl = mapStudent.insert(pair<int,string>(,"Carl"));
if(insert_pairl.second == true)
cout<<"Insert Successfully"<<endl;
else
cout<<"Insert Failure"<<endl; //insert 3 and check
insert_pairl = mapStudent.insert(pair<int,string>(,"Jerry"));
if(insert_pairl.second == true)
cout<<"Insert Successfully"<<endl<<endl;
else
cout<<"Insert Failure"<<endl<<endl; //print
map<int,string>::iterator it;
for(it=mapStudent.begin();it!=mapStudent.end();it++)
cout<<(*it).first<<" "<<(*it).second<<endl; return ;
}
map_insert_check
正如上面所说,当要插入的关键字已经存在,是插入失败的,所以输出结果为:
而采用数组插入方式会直接覆盖
mapStudent[] = "Christal";
mapStudent[] = "Carl";
mapStudent[] = "Jerry";
输出结果为:
(4)数据的遍历,当然分为用迭代器遍历的方式和用数组遍历的方式,其中以迭代器遍历中又分为正向遍历和反向遍历,正向遍历就是我们所熟知的迭代器遍历方式,反向遍历如下:
map<int,string>::iterator it; //print
2 for(it=mapStudent.begin();it!=mapStudent.end();it++)
3 cout<<(*it).first<<" "<<(*it).second<<endl;
4
5 map<int,string>::reverse_iterator rit; //reverse print
6 for(rit=mapStudent.rbegin();rit!=mapStudent.rend();rit++)
7 cout<<(*rit).first<<" "<<(*rit).second<<endl;
输出结果为:
(5)查找数据,一是用count()函数查找,存在返回1,否者返回0;二是用find()函数来定位数据出现的位置;
find()函数返回一个迭代器,如果找到数据,则返回数据所在位置的迭代器;如果不存在,则返回值与end()函数的返回值相同;
1 map<int,string>::iterator _iter;
2 _iter = mapStudent.find();
if(_iter != mapStudent.end())
4 cout<<"Find Successfully"<<endl;
5 else
6 cout<<"Find Failure"<<endl;
(6)删除数据,clear()和erase()
清空map中的所有数据用clear()函数,判定map中是否有数据用empty()函数,为空返回true。
选择性的删除用erase()函数,可以实现三种方式的删除,
用迭代器删除:
1 map<int,string>::iterator _iter;
2 _iter = mapStudent.find();
3 mapStudent.erase(_iter);
用关键字删除:
int n = mapStudent.erase();
if(n == )
3 cout<<"Erase Successfully"<<endl;
else
5 cout<<"Erase Failure"<<endl;
用迭代器成片删除,删除区间是一个前闭后开[ )的集合:
1 mapStudent.erase(mapStudent.begin(),mapStudent.end());
set
4、set:用来存储同一数据类型的数据,内部每个元素都是唯一的,且自动排序;数据结构为红黑树(RB-Tree)
(1)构造函数,set<int> c;
(2)查找函数,find()函数和count()函数;
(3)数据访问函数,begin()、end()、rbegin()、rend();
(4)插入数据,insert(element)、insert(position,element)、insert(begin,end);
(5)删除数据,erase(position)、erase(element)、erase(begin,end);
hash_map&hash_set
5、hash_map和hash_set:底层数据结构是哈希表
hash_map与map用法类似,只是内部数据结构不同,hash_map提供内部数据随机、更快的访问;hash_set同理。
总结
6、总结:
(1)vector封装数组,list封装链表,map和set封装了二叉树;
(2)对于这些STL,应当掌握基本的插入、删除、排序、查找等操作;
(3)对于结构体类型的vector、map、set、hash_map、hash_set等,需要对运算符 ‘ < ’ 进行重载。
例如在map中引入结构体,对 ‘ < ’ 运算符进行重载:
#include<iostream>
#include<string>
#include<map>
using namespace std; struct Student
{
int num;
string name;
Student(int nu,string na) //constructor
{
name = na;
num = nu;
}
public:
bool operator< (const Student& stu) const //operator the <
{
return stu.num<num;
}
}; int main()
{
map<Student,double> mapStudent;
//student information
Student stu1(,"Christal");
Student stu2(,"Carl");
Student stu3(,"Jerry");
//insert
mapStudent.insert(pair<Student,double>(stu1,9.9));
mapStudent.insert(pair<Student,double>(stu2,8.8));
mapStudent.insert(pair<Student,double>(stu3,7.7));
map<Student,double>::iterator it;
for(it=mapStudent.begin();it!=mapStudent.end();it++)
cout<<(*it).first.num<<" "<<(*it).first.name<<" "<<(*it).second<<endl; return ;
}
STL的使用和背后数据结构的更多相关文章
- 转载:STL常用容器的底层数据结构实现
转载至:https://blog.csdn.net/qq_28584889/article/details/88763090 vector :底层数据结构为数组,支持快速随机访问 list:底层数据结 ...
- c++面试题【转】
语言部分: 虚函数,多态.这个概念几乎是必问. STL的使用和背后数据结构,vector string map set 和hash_map,hash_set 实现一个栈类,类似STL中的栈.这个题目初 ...
- STL中经常使用数据结构
STL中经常使用的数据结构: [1] stack.queue默认的底层实现为deque结构. [2] deque:用map管理多个size大小的连续内存块,方便头尾插入. [3] vector: ...
- C++的标准模板库STL中实现的数据结构之顺序表vector的分析与使用
摘要 本文主要借助对C++的标准模板库STL中实现的数据结构的学习和使用来加深对数据结构的理解.即联系数据结构的理论分析和详细的应用实现(STL),本文是系列总结的第一篇,主要针对线性表中的顺序表(动 ...
- C++的标准模板库STL中实现的数据结构之链表std::list的分析与使用
摘要 本文主要借助对C++的标准模板库STL中实现的数据结构的学习和使用来加深对数据结构的理解,即联系数据结构的理论分析和详细的应用实现(STL),本文是系列总结的第二篇.主要针对线性表中的链表 ST ...
- STL学习小结
STL就是Standard Template Library,标准模板库.这可能是一个历史上最令人兴奋的工具的最无聊的术语.从根本上说,STL是一些"容器"的集合,这些" ...
- STL学习总结
STL就是Standard Template Library,标准模板库.这可能是一个历史上最令人兴奋的工具的最无聊的术语.从根本上说,STL是一些"容器"的集合.这些" ...
- STL 较详尽总结
STL就是Standard Template Library,标准模板库.这可能是一个历史上最令人兴奋的工具的最无聊的术语.从根本上说,STL是一些"容器"的集合,这些" ...
- stl 迭代器(了解)
STL 主要是由 containers(容器),iterators(迭代器)和 algorithms(算法)的 templates(模板)构成的. 对应于它们所支持的操作,共有五种 iterators ...
随机推荐
- 《HelloGitHub》第 14 期
公告 欢迎通过在 GitHub 上新建 issues 方式推荐项目,我真心希望读者可以在 HelloGItHub,找到真正的编程乐趣! <HelloGitHub>第 14 期 兴趣是最好的 ...
- IE 不兼容 js indexOf 函数
在使用 js 判断数组中是否存储该元素,我们会用到 indexOf 函数.而在 IE 上 indexOf 函数 无法兼容,通过以下方法解决,仅以文章记录一下 if (!Array.prototyp ...
- 全景智慧掌上城,飞入寻常百姓家——VR全景智慧城市
随着腾讯和阿里陆续将AR技术加入到新年抢红包大战之中,人们对于VR.AR未来的应用空间又多了一些想象.同传统的基于二维元素的抢红包不同,借助VR.AR的技术能够让用户获得一种更加真切的体验,这种体验相 ...
- 一天搞定CSS: CSS选择器优先级--08
选择器优先级:是指代码的执行顺序 通俗的说,就是多个选择器同时对一个标签分别添加样式,那么这个标签显示那个选择器设置的样式 1.优先级规则 2.规则1和2说明 优先级相同,谁后谁优先 优先级不同,优先 ...
- java中调用本地动态链接库(*.DLL)的两种方式详解和not found library、打包成jar,war包dll无法加载等等问题解决办法
我们经常会遇到需要java调用c++的案例,这里就java调用DLL本地动态链接库两种方式,和加载过程中遇到的问题进行详细介绍 1.通过System.loadLibrary("dll名称,不 ...
- 解决jmeter请求不成功或者报403错误
有同学遇到这种情况,jmeter请求一个网站,各项参数填写正确,可是响应是403,同样的请求放在浏览器执行就没有问题: 这是因为被请求的网站做了请求来源过滤,来源不明的请求拒绝访问,我们需要在jmet ...
- Step by Step 用Azure Automation 来开虚机(ARM)
使用Azure Automation来自动化处理各种重复的耗时的云管理任务从而帮助云运维人员提升效率,帮助降低运营成本. 具体相关的介绍以及怎样利用Azure Automation来完成定期开关虚拟机 ...
- CLR基础与术语
CLR(Common Language Runtime):一个可由多种编程语言使用的"运行时". CLR的核心功能(内存管理,程序集加载,安全性,异常处理,线程同步等)可由面向CL ...
- UE4 difference between servertravel and openlevel(多人游戏的关卡切换)
多人游戏的关卡切换分为无缝和非无缝.非无缝切换时,客户端将跟服务器断开连接,然后重新连接到同一个服务器,服务器则加载一个新地图.无缝切换不会发生这样的情况. 有三个函数供我们使用:UEngine::B ...
- USACO Dynamic Programming (1)
首先看一下题目: Introduction Dynamic programming is a confusing name for a programming technique that drama ...