常用的两种方式
- 哈希
- 结构体
哈希表 - 一般映射某样东西和某样东西的关系,可以理解为进阶版的数组
拿(名字 - 年龄 )举例
unorder_map<string,int> hash;
如果是使用哈希表映射,则学会对他们进行遍历输出;
first指的是hash的第一个参数,second值的是hash的第二个参数
for( auto &c : hash){
cout << c.first << ": " << c.second << endl;
}
自创结构体,一般来说如果是多样东西的映射关系,此时结构体会更为方便。如统计一个人
(姓名 - 年龄 - 国籍 -收入),甚至让你根据他们的收入进行排序,此时用结构体更为方便。
struct person{
string name;
int age;
string nation;
int revenue;
}p[n];
结构体排序
- 结构体排序需要额外编写函数
以从小到大为例
bool cmp(结构体类型名字 变量名a,结构体类型名字 变量名b){
return (变量名a.待比较 <= 变量名a.待比较);
}
- 在main()函数中调用cmp进行排序
例子:对p数组进行排序,p数组的每个格子都包含这person类的结构体
sort(p,p+n,cmp);
- 字符串匹配(常用语人名校对)
strcmp(str1,str2);
如果str1 < str2 则函数返回一个负整数
如果str1 == str2 则函数返回一个0
如果str1 > str2 则函数返回一个正整数
因此常用 if(strcmp(str1,str2)==0){ ... } 如果str1 == str2,则...
也常用于搜索结构体中的目标值,如:
存在一个person结构体有个p[10]数组,遍历结构体中有谁叫hyt
for(int i = 0 ; i < 10 ; i++){
if(strcmp(p[i].name,"hyt")==0) {
奖励他上岸xjtu;
}
}
15-04-投票
-
实现一个结构体,可以存储候选人的姓名,以及票数
- 第一类:只接受一次输入,通过这一次读取不但要创建好表,还要统计他们的票数
- 哈希表实现
- 第二类:接受两轮输入,第一轮告诉你候选人都有谁,方便你建表,第二轮才是投票轮
- 哈希表实现
- 结构体实现
- 第一类:只接受一次输入,通过这一次读取不但要创建好表,还要统计他们的票数
-
难点:如果只有一轮输入,该怎么同时建表加统计投票的操作?
.
.
.
.
.
.
接受一轮读入的哈希表版本:
#include <iostream>
#include <unordered_map>
#include <string>
using namespace std;
//创建一个哈希表,映射候选人和他们的票数关系
unordered_map<string, int> candidateVotes;
int main() {
int m, n;
// cout << "请输入选举人数m和候选人数n: ";
cin >> m >> n;
// 初始化候选人的得票数为0(假设候选人名字唯一)
for (int i = 0; i < n; ++i) {
string name;
// cout << "请输入候选人" << i+1 << "的名字: ";
cin >> name;
candidateVotes[name]++;
}
// 输出每个候选人的得票结果
cout << "每个候选人的得票结果如下:" << endl;
for (auto& c : candidateVotes) {
cout << c.first << ": " << c.second << endl;
}
return 0;
}
.
.
.
.
.
.
接受两轮读入的哈希表版本:
#include <iostream>
#include <unordered_map>
#include <string>
using namespace std;
int main() {
int m, n;
// cout << "请输入选举人数m和候选人数n: ";
cin >> m >> n;
//创建一个哈希表,映射候选人和他们的票数关系
unordered_map<string, int> candidateVotes;
// 初始化候选人的得票数为0(假设候选人名字唯一)
for (int i = 0; i < n; ++i) {
string name;
// cout << "请输入候选人" << i+1 << "的名字: ";
cin >> name;
candidateVotes[name] = 0;
}
// 输入每个选举人的投票结果
for (int i = 0; i < m; ++i) {
string vote;
// cout << "请输入选举人" << i+1 << "的投票结果: ";
cin >> vote;
candidateVotes[vote]++;
}
// 输出每个候选人的得票结果
cout << "每个候选人的得票结果如下:" << endl;
for (auto& c : candidateVotes) {
cout << c.first << ": " << c.second << endl;
}
return 0;
}
.
.
.
.
.
.
两轮读入的结构体版本
#include <iostream>
#include <cstring>
using namespace std;
const int M = 3, N = 4;
struct Candidate
{
char name[20];
int s; // 票数
} can[N];
int main()
{
for (int i = 0; i < N; i ++)
{
cout << "请输入一个候选人的名字:";
cin >> can[i].name;
}
for (int i = 0; i < M; i ++)
{
cout << "请输入一个得票的候选人的名字:";
char str[20];
cin >> str;
for (Candidate &c : can)
if (!strcmp(c.name, str))
{
c.s ++;
puts("投票成功!");
break;
}
}
puts("投票结果如下:");
for (Candidate &c : can)
printf("候选人姓名:%s, 得票数:%d\n", c.name, c.s);
return 0;
}
第二题————成绩排序
输入几个学生的姓名和成绩,要求分数相同时顺序相对输入时不变(即要求稳定排序),进行排序后输出。
如输入4个学生的成绩表如下:
输入样例
jack 70
petter 86
70 joy
LiLi 99
输出结果为:
输出样例:
LiLi 99
Petter 86
jack 70
joy 70
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
// 定义学生结构体
struct Student {
string name;
int score;
};
bool cmp(Student a, Student b){
return a.score >= b.score;
}
int main() {
int n;
cout << "Enter the number of students: ";
cin >> n;
// 用于存储学生信息的vector
vector<Student> students;
// 输入学生信息
for (int i = 0; i < n; ++i) {
Student student;
cout << "Enter student " << i + 1 << " name and score: ";
cin >> student.name >> student.score;
students.push_back(student);
}
// 使用稳定排序对学生信息进行降序排序
stable_sort(students.begin(), students.end(),cmp);
// 输出排序后的结果
cout << "Sorted student list:" << endl;
for (const auto& student : students) {
cout << student.name << " " << student.score << endl;
}
return 0;
}
我更喜欢的写法,仔细对比一下跟上面的写法有什么不同,不要弄混了
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
// 定义学生结构体
struct Student {
string name;
int score;
}stu[100];
bool cmp(Student a, Student b){
return a.score >= b.score;
}
int main() {
int n;
cout << "Enter the number of students: ";
cin >> n;
// // 用于存储学生信息的vector
// vector<Student> students;
// 输入学生信息
for (int i = 0; i < n; ++i) {
cin >> stu[i].name >> stu[i].score;
}
// 使用稳定排序对学生信息进行降序排序
stable_sort(stu, stu+n,cmp);
// 输出排序后的结果
cout << "Sorted student list:" << endl;
for (const auto& student : stu) {
if(student.score==0) break;
cout << student.name << " " << student.score << endl;
}
return 0;
}