【问题标题】:Unique id in c++C++中的唯一标识
【发布时间】:2022-11-16 20:25:23
【问题描述】:

所以问题是存储 11 个学生的 ID 并将他们的跑步存储在板球比赛中 运行次数必须大于 10 并且学生的 ID 号必须是唯一的 我只是在创建一个条件时遇到问题,即当用户输入相同的值时,程序应该告诉该值已经存在并添加一个不同的值。l

#include <iostream>
using namespace std;

void main(){
    int id[5];
int run[5];
int a,b,c,d,e,f;
    for(int i=0;i<5;i++){
        for(int j=i;j<5;j++){
            cout<<"Enter id"<<i<<endl;
            cin>>id[i];
            if(id[i]==id[j])
            {cout<<"same id exists";
            cin>>id[i];}
        
        
            cout<<"Enter runs of student \n";
            do{
            cout<<"Runs must be greater or equal to 10 \n";
            cin>>run[i];
            } while(run[i]<10);
     }
    
    }


    system("pause");


    

【问题讨论】:

  • 循环在错误的地方。您不想让用户输入 5 x 5 次。您想将用户输入 5 次,然后将 id 与其他 5 个进行比较(实际第 n 个输入必须仅与其他 n-1 个 id 进行比较)
  • 请多使用标点符号以方便阅读。
  • 这是学习如何使用调试器的好机会。它会告诉你你的代码做了什么,你会看到它与它应该做的有什么不同。修复它只是一小步
  • 您已经知道如何检查用户输入,您正在使用 run-cin,使用 do-while-loop 来完成它。为什么不对第一个输入尝试相同的方法,而是对 ID 进行尝试?注意:您需要重新设计 for 循环以及何时执行什么。也许将 i 重命名为 student_idx 并将 j 重命名为 run_idx 以了解原因。

标签: c++


【解决方案1】:

您希望将 ID 存储在 std::set(或 std::unordered_set)中:

#include <unordered_set>

std::unordered_set ids;
// . . .
if (!ids.contains(new_id) {
    ids.insert(new_id)
}

正如463035818-is-not-a-number指出的那样,如果您需要与每个id关联的学生,请使用std::map((或std::unordered_map):

#include <unordered_map>

std::unordered_map<id_type, stdent_type> students;
// . . . 
if (!students.contains(new_id) {
    students.emplace(new_id, new_student)
}

【讨论】:

  • std::map&lt; id , student &gt;
  • 这是低效的,你正在散列两次。
  • @463035818_is_not_a_number 不错 - 谢谢! :D
  • @HiFile.app-bestfilemanager “过早的优化是万恶之源” Donald Knuth
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-28
  • 1970-01-01
  • 2011-08-05
  • 1970-01-01
  • 1970-01-01
  • 2011-11-18
相关资源
最近更新 更多