zoukankan      html  css  js  c++  java
  • Practice6_3_map_sort

    该程序实现了学生信息到学生成绩的映射,且当map容器的key为结构体时要自己动手重载operator<才行,因为map是排序的,

    对于int型默认就行了,但对于结构体map是不知道如何排序的,所以要自己手重载operator<,否则会编译不过。

    该程序以重载结构体的operator<操作符实现,下一个程序,单独实现一个比较器,作为map的第三个参数。

    经过前面的vector容器练习之后,这些道理和用法都是一样一样的。

    // Practice6_map.cpp : 定义控制台应用程序的入口点。
    //
    
    #include "stdafx.h"
    #include <map>
    #include <string>
    #include <iostream>
    
    using namespace std;
    
    /* map和其他容器一样,默认是less<>升序排序的,这对key为整型时默认就行了,
    但map的key是结构体的时候就需要自己写operator了,否则会编译不过*/
    typedef struct tagStudentInfo
    {
        unsigned int stuId;
        string stuName;
        bool operator < (const tagStudentInfo &stuInfo) const
        {
            if(stuId != stuInfo.stuId)//按照sduId排序,若stuId相同,则按照stuName排序
            {
                return stuId < stuInfo.stuId;
            }
            else
            {
                return stuName.compare(stuInfo.stuName) < 0;//这句写的非常好!!之前也一直在寻找这种写法,它出现了,还是要多读书。。
            }
        }
    }StudentInfo;
    
    string strs[5] = {"huawei", "xiaomi", "meizu", "oppo", "vivo"};
    
    /* 第一种方法,用insert函数插入pair数据*/
    void initMapByPair(map<StudentInfo, int> &mapStu, unsigned int size)
    {
        StudentInfo si = {0, ""}; //两种方式实现初始化,一种是先声明后赋值,另一种直接在循环中初始化。不能混用!!为啥??
        for(unsigned int i = 0; i < size; i++)
        {
            //StudentInfo si = {5, strs[i]};
            si.stuId = i + 1;
            si.stuName = strs[i];
            mapStu.insert(pair<StudentInfo, int>(si, i + 90));
        }
    }
    
    void printMapStu(map<StudentInfo, int> mapStu)
    {
        map<StudentInfo, int>::iterator it = mapStu.begin();
        for(; it != mapStu.end(); it++)
        {
            cout << it->first.stuId << "," << it->first.stuName << "," << it->second << endl;//使用first,second取出map的key及value
        }
    }
    
    int _tmain(int argc, _TCHAR* argv[])
    {
        map<StudentInfo, int> mapStudent;//以学生信息映射考试成绩
        initMapByPair(mapStudent, 5);
    
        printMapStu(mapStudent);
    
        return 0;
    }

    运行结果:

    1,huawei,90
    2,xiaomi,91
    3,meizu,92
    4,oppo,93
    5,vivo,94

  • 相关阅读:
    DOS批处理中%cd%和%~dp0的区别
    DIH处理包含回车符换行符html标签内容的文本
    国内可用免费语料库(已经整理过,凡没有标注不可用的链接均可用)
    TextRank算法提取关键词的Java实现
    贝叶斯推断及其互联网应用(三):拼写检查
    朴素贝叶斯分类器的应用
    TF-IDF与余弦相似性的应用(三):自动摘要
    TF-IDF与余弦相似性的应用(二):找出相似文章
    TF-IDF与余弦相似性的应用(一):自动提取关键词
    搜索引擎与网页文本分词的原理
  • 原文地址:https://www.cnblogs.com/liuzc/p/6498484.html
Copyright © 2011-2022 走看看