在 C++ 中搜索地图的元素

Searching through the elements of a map in c++

题目如下:创建2个类 Students, Subjects,将他们的数据成员作为Maps输入,并使用Composition.The互连,代码如下:

#include <iostream>
#include <string>
#include <map>

using namespace std;

class student {
public:
    map<int, string> student_map;

    student()
    {
        student_map[100] = "  Noel Philip";
        student_map[101] = "  John";
        student_map[102] = "  Jerry";
        student_map[103] = "  James";
    }

    void display_details_Engineering()
    {
        for (map<int, string>::iterator itr = student_map.begin(); ((itr->first) == 100) || ((itr->first) == 101); ++itr) {
            cout << "ROll NO" << itr->first << "  Name" << itr->second << endl;
        }
    }

    void display_details_Medicine()

    {
        for (map<int, string>::iterator itr = student_map.begin(); ((itr->first) == 102) || ((itr->first) == 103); ++itr) {
            cout << "ROll NO" << itr->first << "  Name" << itr->second << endl;
        }
    }

    void display_alldetails()
    {
        for (map<int, string>::iterator itr = student_map.begin(); itr != student_map.end(); ++itr) {
            cout << "ROll NO" << itr->first << "  Name" << itr->second << endl;
        }
    }

    ~student(){};
};

class subjects {

public:
    map<string, int> eng_subjects;

    map<string, int> medicine_subjects;

    subjects()
    {
        eng_subjects["  Engineering Physics"] = 90;
        eng_subjects["  Engineering Chemistry"] = 80;
        medicine_subjects["  Zoology"] = 90;
        medicine_subjects["  Humanology"] = 80;
    }

    void display_details_Engineering()
    {
        for (map<string, int>::iterator itr = eng_subjects.begin(); itr != eng_subjects.end(); ++itr) {
            cout << "Subject Name" << itr->first << "  Grades" << itr->second << endl;
        }
        s1.display_details_Engineering();
    }

    void display_details_Medicine()
    {
        for (map<string, int>::iterator itr = medicine_subjects.begin(); itr != medicine_subjects.end(); ++itr) {
            cout << "Subject Name" << itr->first << "  Grades" << itr->second << endl;
        }
        s1.display_details_Medicine();
    }
    ~subjects(){};

    //  void display_details_Engineering()      Not Required
    //{
    //s1.display_details_Engineering();
    //}
private:
    student s1;
};

int main()
{
    student s;

    s.display_alldetails();
    s.display_details_Engineering();
    s.display_details_Medicine();

    subjects sub;
    sub.display_details_Engineering();
    sub.display_details_Medicine();
}

输出结果如下

ROll NO100 名字 Noel Philip

ROll NO101 名字约翰

ROll NO102 姓名 Jerry

ROll NO103 姓名 James

ROll NO100 名字 Noel Philip

ROll NO101 名字约翰

学科名称工程化学成绩80

学科名称工程物理成绩90

ROll NO100 名字 Noel Philip

ROll NO101 名字约翰

学科名称人文学 Grades80

学科名称动物学成绩90

当要求输出为:

ROll NO100 名字 Noel Philip

ROll NO101 名字约翰

ROll NO102 姓名 Jerry

ROll NO103 姓名 James

ROll NO100 名字 Noel Philip

ROll NO101 名字约翰

ROll NO102 姓名 Jerry

ROll NO103 姓名 James

学科名称工程化学成绩80.

学科名称工程物理成绩90

ROll NO100 名字 Noel Philip

ROll NO101 名字约翰

学科名称人文学 Grades80

学科名称动物学成绩90

ROll NO102 姓名 Jerry

ROll NO103 姓名 James

我没有仔细看,但是在你的 "for" 循环中,中间表达式不是过滤器,如果它的计算结果不是布尔值 true 那么 for 循环就会停止。所以在 "display_details_Medicine()" 中,只要 itr->first 不等于 102 或 103,循环就会结束。

在方法体内进行比较。或者更好的是,为每个集合创建一个值数组并遍历每个集合,这比读取映射的每个成员并仅选择您想要的成员要有效得多。

@rabinnh 是正确的。对于 display_details_Engineering()display_details_Medicine(),检查循环内的条件。

下面的代码应该可以正常工作。

void display_details_Engineering()
{
    for (map<int, string>::iterator itr = student_map.begin(); itr != student_map.end(); ++itr) {
        if (itr->first == 100 || itr->first == 101)
            cout << "ROll NO" << itr->first << "  Name" << itr->second << endl;
    }
}

void display_details_Medicine()

{
    for (map<int, string>::iterator itr = student_map.begin(); itr != student_map.end(); ++itr) {
        if (itr->first == 102 || itr->first == 103)
            cout << "ROll NO" << itr->first << "  Name" << itr->second << endl;
    }
}

您正在使用按键排序的std::map

display_details_Medicine() 中,您要打印键 102103。但是,您的 for 循环首先看到键 100,它使循环条件失败,结束循环而不打印任何内容。