【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

相关内容

热门资讯

杭州游之虎跑公园小学作文【经... 杭州游之虎跑公园小学作文 篇一我最喜欢的杭州景点之一就是虎跑公园。这个公园坐落在风景如画的西湖边,是...
“日”字变形记小学作文【推荐... “日”字变形记小学作文 篇一太阳的日子我喜欢太阳,因为它给了我们光明和温暖。太阳每天都会升起,照亮大...
小小的欲望作文350字(最新... 篇一:小小的欲望小小的欲望作文350字 篇一小小的欲望,是我们内心深处微不可见的火花,它时而燃烧得熊...
奇思妙想的作文400字(精选... 奇思妙想的作文400字 篇一标题:梦幻的花园我有一个奇妙的梦想,梦见自己拥有了一个令人惊叹的花园。这...
成长的烦恼四年级作文【优秀5... 成长的烦恼四年级作文 篇一成长的烦恼我是一名四年级的学生,正在经历着成长的烦恼。在成长的道路上,我遇...
爱人的作文【最新3篇】 爱人的作文 篇一爱人的作文我有一个特别重要的人,那就是我的爱人。他是我生命中最亲密的伴侣,也是我最深...
中秋之夜的小学作文500字 中秋之夜的小学作文500字  中秋节已悄悄的离我们近了,近了,此时我的心情又怎能不振奋呢?面临三天的...
有你真好的作文(最新6篇) 有你真好的作文 篇一爱与陪伴人生中,有太多的瞬间让我感受到了你的好。你是我最亲近的人,也是我最信任的...
火烧云小学作文【最新6篇】 火烧云小学作文篇一:火烧云的美丽火烧云是一种非常美丽的自然景观,它们在天空中绽放出绚丽的色彩,给人们...
人间自有温情在作文(精简3篇... 人间自有温情在作文 篇一温情的力量人间自有温情,在日常生活中,我们时常能够感受到这种力量。温情是指人...
小学三年级抗疫情作文(精简5... 小学三年级抗疫情作文 篇一:我们一起抗疫,共克时艰新冠疫情的突然爆发给全世界带来了巨大的挑战,人们的...
有你真好的作文(通用6篇) 有你真好的作文 篇一有你真好每个人的生活中都会有那么一个重要的人,他们的存在让我们的生活变得更加美好...
我上学了(优选3篇) 我上学了 篇一我上学了已经有好几年了,回想起来,这段时光仿佛就在眨眼间过去了。刚开始上学的时候,我还...
有趣的游戏小学作文400字【... 有趣的游戏小学作文400字 篇一标题:童年乐园——躲猫猫游戏在我心中,有一个让我欢乐无比的游戏,那就...
那次玩得真高兴作文(优秀5篇... 那次玩得真高兴作文 篇一那次玩得真高兴上个周末,我和我的朋友们一起去了游乐园玩,那次真是玩得太高兴了...
初一七年级学生作文题目【优选... 初一七年级学生作文题目 篇一我的暑假计划暑假即将来临,我对未来的两个月充满了期待和计划。今年的暑假,...
假如考上了名校,我要回来看看... 假如考上了名校,我要回来看看我的母校小学作文 篇一当我考上了名校,我内心感到无比的兴奋和自豪。这是我...
校园桂花香小学作文【最新3篇... 校园桂花香小学作文 篇一校园桂花香小学作文我所在的学校是一所名为桂花香小学的学校,这个名字来源于学校...
春天小学一年级作文300字(... 春天小学一年级作文300字 篇一春天的花儿春天是一个美丽的季节,大地万物都在春天苏醒,充满了生机和活...
小学中秋节的作文【优选3篇】 小学中秋节的作文 篇一中秋节是中国传统的节日之一,也是我最喜欢的节日。在这一天,我和家人一起庆祝,品...