【AlgorithmTraining】06:STL容器使用与练习(上)
创始人
2024-06-01 04:11:36
0

STL容器的使用与练习(上)


OVERVIEW

  • STL容器的使用与练习(上)
      • string类
      • 1.vector动态数组:
        • (1)vector动态一维数组:
        • (2)vector动态二维数组:
      • 2.deque双端队列:
      • 3.stack栈:
      • 4.queue队列:
        • (1)队列的基本使用:
        • (2)队列自定义类型:
      • 5.priority_queue优先队列
        • (1)大顶堆:
        • (2)小顶堆:
        • (3)队列自定义类型:运算符重载
        • (4)队列自定义类型:仿函数
      • 6.set集合:
        • (1)set的基本使用:
        • (2)set自定义类型:
      • 7.map键值对:
        • (1)map的基本使用:
        • (2)unordered_map:

STL六大组件:

  1. 容器
  2. 适配器
  3. 空间分配器:malloc
  4. 迭代器:高级指针
  5. 算法库:sort
  6. 仿函数:一个类重载一个括号

string类

string常用方法
find(what, start)
substr(start, length)
insert(start, what)
replace(start, length, what)
size()\length()

注意:find()返回值为第一个目标出现的下标值,若没有找到将返回string::npos(-1)

#include 
#include 
using namespace std;int main(){string str = "ABCDEF";//1.输出字符串长度cout << str.size() << endl;//2.查找字符串DE的位置cout << str.find("DE") << endl;//3.输出没有查找到的结果cout << (int)str.find("DE", 5) << endl;//4.字符串截取cout << str.substr(3, 2) << endl;//5.字符串插入str.insert(1, "abc");cout << str << endl;//6.字符串替换str.replace(2, 5, "000");cout << str << endl;//7.一次性读入一行包含空格的字符串string str1;getline(cin, str1);cout << str1 << endl;return 0;
}

image-20210324231317375

1.vector动态数组:

vector常用方法说明
v.size()获取vector中元素数量
v.push_back(x)向vector末尾插入值为x的元素

(1)vector动态一维数组:

#include
#include
using namespace std;int main(){//初始化一个10个元素都为88的一维数组vector v(10, 88);v.push_back(99);v.push_back(8);v.push_back(56);for(int i = 0; i < v.size(); ++i){cout << v[i] << "\n";}return 0;
}

image-20210324233018469

(2)vector动态二维数组:

#include
#include
#include
using namespace std;int main(){//初始化一位10*10元素都为9的二维数组vector > v(10, vector(10, 9));//(1)外层循环次数:v.sizefor(int i = 0; i < v.size(); ++i){//(2)内层循环次数:v[i].sizefor(int j = 0; j < v[i].size(); ++j){cout << v[i][j] << " ";}cout << endl;}return 0;
}

image-20210324233631692

2.deque双端队列:

deque常用方法
push_front()
pop_front()
push_back()
pop_back()
size()\empty()
#include
#include
using namespace std;int main(){deque que;que.push_back(3);que.push_back(4);que.push_back(5);que.push_front(6);que.push_front(7);while(!que.empty()){cout << que.front() << " " << que.back() << endl;que.pop_back();}return 0;
}

image-20210325064116008

3.stack栈:

stack常用方法
push()
pop()
top()
empty()
size()
#include
#include
using namespace std;int main(){stack sta;sta.push("1234567890");sta.push("abc");sta.push("909090");sta.push("T");cout << sta.size() << endl;cout << sta.top() << endl;while(!sta.empty()){cout << sta.top() << endl;sta.pop();}return 0;
}

image-20210325065113002

stack栈本质上不是容器属于适配器,是由双端队列进行二次封装得到

4.queue队列:

queue常用方法
push()
pop()
front()
back()
empty()
size()

(1)队列的基本使用:

#include
#include
using namespace std;int main(){queue que;que.push(6);que.push(7);que.push(1);cout << que.size() << endl;while(!que.empty()){cout << que.front() << " " << que.back() << endl;que.pop();}return 0;
}

image-20210325070106508

queue队列本质上不是容器属于适配器,大部分情况下是由双端队列进行二次封装得到

(2)队列自定义类型:

#include
#include
using namespace std;struct node{int num, cnt;
};int main(){queue que;que.push((node){5, 6});que.push((node){1, 10});que.push((node){6, -1});cout << que.size() << endl;while(!que.empty()){cout << que.front().num << " " << que.front().cnt << endl;que.pop();}return 0;
}

image-20210326100215015

5.priority_queue优先队列

priority_queue常用方法
push()
pop()
top()
empty()
size()

priority_queue底层实现为堆,且建立后默认为大顶堆

(1)大顶堆:

#include
#include
using namespace std;int main(){priority_queue que;que.push(5);que.push(9);que.push(-1);que.push(999);que.push(72);cout << que.size() << endl;while(!que.empty()){cout << que.top() << endl;que.pop();}return 0;
}

image-20210325071445002

(2)小顶堆:

#include
#include
using namespace std;int main(){/*priority_queue, greater > que;priority_queue<类型(装的是什么), 容器(用什么装), 比较规则(greater) > que;*/priority_queue, greater > que;que.push(5);que.push(9);que.push(-1);que.push(999);que.push(72);cout << que.size() << endl;while(!que.empty()){cout << que.top() << endl;que.pop();}return 0;
}

image-20210325071819938

(3)队列自定义类型:运算符重载

#include
#include
using namespace std;/*容器存储自定义类型必须重载小于号:bool operator< (const node &b)const{return this->num < b.num;    } 
*/struct node{int num, cnt;bool operator< (const node &b)const{return this->num < b.num;    }
};int main(){priority_queue que;que.push((node){1, 2});que.push((node){4, -2});que.push((node){3, -9});cout << que.size() << endl;while(!que.empty()){cout << que.top().num << " " << que.top().cnt << endl;que.pop();}return 0;
}

image-20210325073815668

总结:自定义类型自定义输出顺序规则为按照第一个数字从大到小输出

(4)队列自定义类型:仿函数

#include
#include
using namespace std;struct node{int num, cnt;
};/*
自定义仿函数:
struct func{bool operator() (const node &a, const node &b){return a.num < b.num;    }
};
*/struct func{bool operator() (const node &a, const node &b){return a.num < b.num;    }
};int main(){priority_queue, func> que;que.push((node){1, 2});que.push((node){4, -2});que.push((node){3, -9});cout << que.size() << endl;while(!que.empty()){cout << que.top().num << " " << que.top().cnt << endl;que.pop();}return 0;
}

image-20210327063621993

6.set集合:

set集合特点:

  1. 无重复元素
  2. 元素是有序的
  3. 插入、查找、删除操作的时间复杂度为log(N)

(1)set的基本使用:

#include
#include
using namespace std;int main(){set s;s.insert(7);s.insert(5);s.insert(99);s.insert(128);s.insert(-1);cout << s.size() << endl;if(s.count(128) == 1){cout << "YES" << endl;}else{cout << "NO" << endl;}s.erase(128);if(s.count(128) == 1){cout << "YES" << endl;}else{cout << "NO" << endl;}//迭代器遍历set集合中的元素for(auto it = s.begin(); it != s.end(); it++){cout << *it << endl; }return 0;
}

image-20210327070410874

(2)set自定义类型:

#include
#include
using namespace std;struct node{int num,cnt;bool operator< (const node &b)const {return this->num < b.num;}
};int main(){set s;s.insert((node){8, 9});s.insert((node){-99, 128});s.insert((node){2, 73});for(auto it = s.begin(); it != s.end(); it++){cout << it->num << " " << it->cnt << endl;}return 0;
}

image-20210327071248439

7.map键值对:

除了map中存储的为键值对,其他与set集合基本一致

(1)map的基本使用:

#include
#include
#include
#include
using namespace std;int main(){map m;m.insert(make_pair("12345", 789));m.insert(make_pair("abcdefg", 111111));m.insert(make_pair("T", 99));if(m.count("abcdefg") == 1){cout << "YES" << endl;cout << m["abcdefg"] << endl;}else{cout << "NO" << endl;}m["999999"] = 56789;cout << m["999999"] << endl;//使用count()查询与使用[]查询的区别m.erase("999999");cout << m.count("999999") << endl;cout << m["999999"] << endl;cout << m.count("999999") << endl;//遍历输出map中的键值对for(auto it = m.begin(); it != m.end(); it++){cout << it->first << " " << it->second << endl;}return 0;
}

image-20210327073908982

注意:在使用[]查询键值对时,若键值对不存在将自动创建,int类型将初始化值为0

(2)unordered_map:

#include
#include
#include
using namespace std;int main(){unordered_map m;m["1234567890"] = 67890;m["abcdefg"] = 12345;m["(+_+)"] = 666666;cout << m.size() << endl;for(auto it = m.begin(); it != m.end(); it++){cout << it->first << " " << it->second << endl;}return 0;
}

image-20210327080149728

注:对于无序map/set其内部的结构是一个哈希表(利用哈希查找函数),

  • 所以如果在unordered_map/set中使用自定义类型,就必须要自己手写哈希函数。
  • 在容器选择时,如果需要容器有序时才使用map/set,若无序有序则使用unordered_map/set以尽可能提升运行速度。

unordered_set

unordered_map

unordered_multiset

unordered_multimap

相关内容

热门资讯

常用商务英语口语   商务英语是以适应职场生活的语言要求为目的,内容涉及到商务活动的方方面面。下面是小编收集的常用商务...
六年级上册英语第一单元练习题   一、根据要求写单词。  1.dry(反义词)__________________  2.writ...
复活节英文怎么说 复活节英文怎么说?复活节的英语翻译是什么?复活节:Easter;"Easter,anniversar...
2008年北京奥运会主题曲 2008年北京奥运会(第29届夏季奥林匹克运动会),2008年8月8日到2008年8月24日在中华人...
英语道歉信 英语道歉信15篇  在日常生活中,道歉信的使用频率越来越高,通过道歉信,我们可以更好地解释事情发生的...
六年级英语专题训练(连词成句... 六年级英语专题训练(连词成句30题)  1. have,playhouse,many,I,toy,i...
上班迟到情况说明英语   每个人都或多或少的迟到过那么几次,因为各种原因,可能生病,可能因为交通堵车,可能是因为天气冷,有...
小学英语教学论文 小学英语教学论文范文  引导语:英语教育一直都是每个家长所器重的,那么有关小学英语教学论文要怎么写呢...
英语口语学习必看的方法技巧 英语口语学习必看的方法技巧如何才能说流利的英语? 说外语时,我们主要应做到四件事:理解、回答、提问、...
四级英语作文选:Birth ... 四级英语作文范文选:Birth controlSince the Chinese Governmen...
金融专业英语面试自我介绍 金融专业英语面试自我介绍3篇  金融专业的学生面试时,面试官要求用英语做自我介绍该怎么说。下面是小编...
我的李老师走了四年级英语日记... 我的李老师走了四年级英语日记带翻译  我上了五个学期的小学却换了六任老师,李老师是带我们班最长的语文...
小学三年级英语日记带翻译捡玉... 小学三年级英语日记带翻译捡玉米  今天,我和妈妈去外婆家,外婆家有刚剥的`玉米棒上带有玉米籽,好大的...
七年级英语优秀教学设计 七年级英语优秀教学设计  作为一位兢兢业业的人民教师,常常要写一份优秀的教学设计,教学设计是把教学原...
我的英语老师作文 我的英语老师作文(通用21篇)  在日常生活或是工作学习中,大家都有写作文的经历,对作文很是熟悉吧,...
英语老师教学经验总结 英语老师教学经验总结(通用19篇)  总结是指社会团体、企业单位和个人对某一阶段的学习、工作或其完成...
初一英语暑假作业答案 初一英语暑假作业答案  英语练习一(基础训练)第一题1.D2.H3.E4.F5.I6.A7.J8.C...
大学生的英语演讲稿 大学生的英语演讲稿范文(精选10篇)  使用正确的写作思路书写演讲稿会更加事半功倍。在现实社会中,越...
VOA美国之音英语学习网址 VOA美国之音英语学习推荐网址 美国之音网站已经成为语言学习最重要的资源站点,在互联网上还有若干网站...
商务英语期末试卷 Part I Term Translation (20%)Section A: Translate ...