🌐第一部分 迭代器篇
😎1.1 遍历vertor
描述
键盘输入 5 个整数,将这些数据保存到 vector 容器中,采用正向迭代器和反向迭代器分别遍历 vector 中的元素并输出。
输入描述:
输入 5 个整数
输出描述:
使用正向迭代器和反向迭代器分别遍历输出 vector 中的元素,元素之间使用空格隔开,两次遍历之间换行。
例如:
1 2 3 4 5
5 4 3 2 1
示例1
输入: 1 2 3 4 5 输出: 1 2 3 4 5 5 4 3 2 1
💡解决如下:
#include <iostream> #include <vector> using namespace std; int main(){ int n=5; vector <int> myVector; for(int i=0;i<n;i++){ int k; cin>>k; myVector.push_back(k); } //遍历方式 for(int value:myVector){ cout<<value<<" "; } cout<<endl; //遍历 for(int i=myVector.size()-1;i>=0;i--){ cout<<myVector[i]<<" "; } cout<<endl; return 0; }
😎1.2 遍历set
描述
键盘随机输入 6 个整数,将这些数据保存到数组中,获取数组中的最小值和最大值并输出。
输入描述:
键盘随机输入 6 个整数
输出描述:
输出数组中的最小值和最大值,两个值中间使用空格隔开
示例1
输入: 5 12 80 7 15 60 输出: 5 80
💡解决如下:
#include <iostream> #include <set> using namespace std; int main(){ set<int> mySet; int n=5; for(int i=0;i<n;i++){ int k; cin>>k; mySet.insert(k); } for(auto it=mySet.begin();it!=mySet.end();it++){ cout<<*it<<" "; } cout<<endl; return 0; }
🌐第二部分 STL序列式容器篇
😎2.1 智能排队系统
描述
请设计一个排队程序,用户有普通客人和 VIP 客人之分,VIP 客人不排队(即 VIP 客人在队列头部),请将已有的guest1和guest2放入队列中(guest1排在guest2前),并将VIP客人新增至队列头部。
输入描述:
无
输出描述:
VIP客人姓名 guest1姓名 guest2姓名(每个客人的名字用空格隔开)
💡解决如下:
#include <iostream> #include <deque> using namespace std; class Guest { public: string name; bool vip; Guest(string name, bool vip) { this->name = name; this->vip = vip; } }; int main() { Guest guest1("张三", false); Guest guest2("李四", false); Guest vipGuest("王五", true); deque<Guest> guestQueue; // 将 VIP 客人加入队列头部 guestQueue.push_front(vipGuest); // 将普通客人加入队列尾部 guestQueue.push_back(guest1); guestQueue.push_back(guest2); for (const Guest& g : guestQueue) { cout << g.name << " "; } return 0; }
😎2.2 最后k个元素
描述
给出一个包含n个整数的数组a,使用vector实现倒序输出数组的最后k个元素。
输入描述:
第一行两个整数n,k。(0<k≤n)
第二行n个整数表示数组a。
输出描述:
输出一行k个用空格隔开的整数。
示例1
输入: 3 2 1 3 2 输出: 2 3
💡解决如下:
#include <iostream> #include <vector> using namespace std; int main(){ vector <int> a; int n,num; cin>>n>>num; for(int i=0;i<n;i++){ int k; cin>>k; a.push_back(k); } int count=0; for(int i=a.size()-1;count<num;i--,count++){ cout<<a[i]<<" "; } cout<<endl; return 0; }
🌐第三部分 关联式容器篇
😎3.1 去除字符串中重复的字符
描述
从键盘获取一串字符串,要求去除重复的字符,请使用 set 解决。
输入描述:
键盘输入任意字符串
输出描述:
输出去重后的内容(直接按 set 的默认顺序输出字符即可)
示例1
输入: helloworld 输出: dehlorw
💡解决如下:
#include <iostream> #include <set> using namespace std; int main() { string s; getline(cin,s); set<char> mySet; //去重 int slen=s.length(); for(int i=0;i<slen;i++){ mySet.insert(s[i]); } //输出 for(auto it=mySet.begin();it!=mySet.end();it++){ cout<<*it; } cout<<endl; return 0; }
😎3.2 统计字符串中各字母字符对应的个数
描述
键盘输入一个字符串,统计字符串中各个字母字符的个数。例如:键盘输入"Hello World!",上述字符串中各个字母字符的出现的次数为:
H:1
e:1
l:3
o:2
W:1
r:1
d:1
要求使用map实现,键的排序使用map默认排序即可。
输入描述:
键盘输入任意一个字符串
输出描述:
输出字母字符和字符对应的出现字数(注:相同字母的大小写算两个不同字符,字母字符和出现次数之间用:隔开,按 map 的默认顺序输出即可)
示例1
输入: Hello World 输出: H:1 W:1 d:1 e:1 l:3 o:2 r:1
💡解决如下:
#include <iostream> #include <map> using namespace std; int main() { string s; getline(cin, s); map<char, int> m; //思路:1.赋值;2.迭代器输出 /*赋值*/ int slen = s.length(); for(int i=0;i<slen;i++){ if(s[i]!=' ' && !(s[i]>='0' &&s[i]<='9')){ m[s[i]]++; } } /*输出*/ for (const auto& pair : m) { cout << pair.first << ":" << pair.second << endl; } return 0; }
😎3.3 查找
描述
给出一个大小为n的数组a,有m次询问,每次询问给出一个x,你需要输出数组a中大于x的最小值,如果不存在,输出-1。
要求使用set实现。
输入描述:
第一行两个整数n,m。
第二行n个整数表示数组a。
接下来m行,每行一个整数x。
输出描述:
对每个询问,输出一行一个整数表示答案,如果不存在输出-1。
示例1
输入: 5 5 6 3 8 3 5 6 9 7 7 3 输出: 8 -1 8 8 5
💡解决如下:
#include <iostream> #include <set> using namespace std; int main(){ int n,m; cin>>n>>m; set<int> s; for(int i=0;i<n;i++){ int k; cin>>k; s.insert(k); } for(int i=0;i<m;i++){ int x; cin>>x; int flag=0,min=0; for(auto it=s.begin();it!=s.end();it++){//set元素默认升序啦 if(*it>x){ flag++; cout<<*it<<endl; break; } } if(flag==0) cout<<-1<<endl; } return 0; }
改进:利用set原本升序存储的性质
#include <iostream> #include <set> using namespace std; int main() { int n, m; cin >> n >> m; set<int> s; for (int i = 0; i < n; i++) { int k; cin >> k; s.insert(k); } for (int i = 0; i < m; i++) { int x; cin >> x; //思路:1.set不存在x则插入x //2.再判断x是不是最后一位【是则x最大,返回-1,否则返回x的后一位】 set<int>::iterator it = s.find(x); int flag=0; if (it == s.end()){ s.insert(x); flag=1; } it = s.find(x); if (++it != s.end()) {//说明有比x大的,要输出x的后一位 // 先递增,然后再判断 cout<<*it<<endl; } else { cout << -1 << endl; } if(flag!=0){//记得要释放新加的元素 s.erase(x); } } return 0; }
😎3.4 判断元素是否出现
描述
给出一个大小为n的数组a,有m次询问,每次询问给出一个x,你需要判断x是否在数组a中出现,如果出现了,输出"yes",否则输出"no"。
要求使用map实现。
输入描述:
第一行两个整数n,m。
第二行n个整数表示数组a。
接下来m行,每行一个整数x。
输出描述:
对每个询问,输出一行表示答案。
示例1
输入: 5 3 1 2 3 4 5 5 4 6 输出: yes yes no
💡解决如下:
#include <iostream> #include <vector> using namespace std; int main(){ int n,m; cin>>n>>m; vector <int> myVector; for(int i=0;i<n;i++){ int k; cin>>k; myVector.push_back(k); } for(int i=0;i<m;i++){ int x; cin>>x; int flag=0; for(int value:myVector){ if(value==x) flag++; } if(flag!=0) cout<<"yes"<<endl; else cout<<"no"<<endl; } return 0; }
🌐第四部分 算法篇
😎4.1 使用算法
描述
键盘输入 5 个整数,使用 vector 进行存储,使用 STL 排序算法对元素进行排序(从大到小),再使用 STL 遍历算法输出元素。(元素和元素之间使用空格隔开)
输入描述:
键盘输入 5 个整数
输出描述:
输出排序后的元素,元素和元素之间使用空格隔开
示例1
输入: 89 90 78 66 45 输出: 90 89 78 66 45
💡解决如下:
#include <iostream> #include <vector> using namespace std; //排序 void MpSort(vector<int> & a){ int n=a.size(); for(int i=0;i<n-1;i++){ int k=i; for(int j=i+1;j<n;j++){ if(a[k]<a[j]){ int t=a[k]; a[k]=a[j]; a[j]=t; } } } } int main() { int num; vector<int> v; for (int i = 0; i < 5; i++) { cin >> num; v.push_back(num); } vector<int> &vv=v; MpSort(vv); for(int value:v){ cout<<value<<" "; } cout<<endl; return 0; }
😎4.2 找到数组里的第k大数(C++)
描述
给出一个包含n个整数的数组a,使用vector存储。
用STL算法实现输出数组的第k大数。
输入描述:
第一行两个整数n,k。(1≤k≤n)
第二行n个整数表示数组a。
输出描述:
输出一个数表示答案。
示例1
输入: 10 2 22 30 99 98 41 69 3 47 40 97 输出: 22
💡解决如下:
#include <iostream> #include <vector> using namespace std; //返回第k大的数 int func(vector<int> v,int k){ int n=v.size(); for(int i=0;i<n-1;i++){ for(int j=0;j<n-1-i;j++){ if(v[j]>v[j+1]){//降序排序 int t=v[j]; v[j]=v[j+1]; v[j+1]=t; } } } return v[k-1]; } int main(){ int n,k; cin>>n>>k; vector<int>a; for(int i=0;i<n;i++){ int num; cin>>num; a.push_back(num); } cout<<func(a,k)<<endl; return 0; }
