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

时间:2016-10-25 13:24:22

标签: c++ stl maps composition

问题如下:创建2个班级学生,科目并将他们的数据成员作为地图输入并使用Composition进行互连。代码如下:

#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名字詹姆斯

ROll NO100名称Noel Philip

ROll NO101姓名约翰

学科名称工程化学等级80

学科名称工程物理Grades90

ROll NO100名称Noel Philip

ROll NO101姓名约翰

学科名称人文学80年级

主题名称动物学等级90

当所需的输出为:

ROll NO100名称Noel Philip

ROll NO101姓名约翰

ROll NO102名称Jerry

ROll NO103名字詹姆斯

ROll NO100名称Noel Philip

ROll NO101姓名约翰

ROll NO102名称Jerry

ROll NO103名字詹姆斯

学科名称工程化学等级80。

学科名称工程物理Grades90

ROll NO100名称Noel Philip

ROll NO101姓名约翰

学科名称人文学80年级

主题名称动物学等级90

ROll NO102名称Jerry

ROll NO103名字詹姆斯

2 个答案:

答案 0 :(得分:1)

我没有仔细观察,但是在你的“for”循环中,中间表达式不是过滤器,如果它没有计算为布尔值,则for循环停止。因此,在“display_details_Medicine()”中,只要itr-&gt;首先不等于102或103,循环就会结束。

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

答案 1 :(得分:0)

@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,这会导致循环条件失败,结束循环而不打印任何内容。