程序设计与算法(一)C语言程序设计

十二周(笔记)

12.1 multimap

  1. 用法
    • multimap 容器里的元素,都是pair形式的
    • multimap < T1,T2 >mp;
    • mp里面的元素类型是 struct { T1 first; T2 second; };
    • multimap中的元素按照first排序,并可以按first进行查找
    • 缺省的排序规则是==“a.first < b.first” 为true==,则a排在b前面
  2. 实例
/*
学生成绩录入和查询系统
两种操作
1. Add name id score  添加学生信息
2. Query score        查询(输出已有记录中分数比score低的最高分获得者的信息,
如果有多个学生都满足条件就输出学号最大的那个学生,找不到满足条件的就输出"Nobody".
 )

*/
#include <cstring>
#include <iostream>
#include <map>  //使用multimap和map需要包含此头文件
using namespace std;
struct StudentInfo {
    int id;
    char name[20];
};
struct Student {
    int score;
    StudentInfo info;
};
typedef multimap<int, StudentInfo> MAP_STD;
//此后 MAP_STD 等价于 multimap <int,StudentInfo>
int main() {
    MAP_STD mp;
    Student st;
    char cmd[20];
    while (cin >> cmd) {
        if (cmd[0] == 'A') {
            cin >> st.info.name >> st.info.id >> st.score;
            mp.insert(make_pair(st.score, st.info));
            // make_pair生成一个 pair<int,StudentInfo>变量
            //其first等于st.score,second 等于st.info
        } else if (cmd[0] == 'Q') {
            int score;
            cin >> score;
            MAP_STD::iterator p = mp.lower_bound(score);
            if (p != mp.begin()) {
                p--;
                score = p->first;
                //必要查询分数低的最高分
                MAP_STD::iterator maxp = p;
                int maxId = p->second.id;
                for (; p != mp.begin() && p->first == score; p--) {
                    //遍历所有成绩和score相等的学生
                    if (p->second.id > maxId) {
                        maxp = p;
                        maxId = p->second.id;
                    }
                }
                if (p->first == score) {
                    //如果上面的循环是因为p==mp.begin()而终止,则p指向的元素还要处理
                    if (p->second.id > maxId) {
                        maxp = p;
                        maxId = p->second.id;
                    }
                }
                cout << maxp->second.name << " " << maxp->second.id << " "
                     << maxp->first << endl;
            } else {
                // lower_bound的结果就是begin,说明没人分数比查询分数低
                cout << "Nobody" << endl;
            }
        }
    }
    return 0;
}

/*
Add Jack 12 78
Query 78
Query 81
Add Percy 9 81
Add Marry 8 81
Query 82
Add Tom 11 79
Query 80
Query 81
*/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
页面置换算法是操作系统中的重要概念,其目的是为了优化内存的利用。常见的页面置换算法包括最近最少使用(LRU)算法、先进先出(FIFO)算法、时钟算法等。 以下是一个简单的页面置换算法程序设计C语言实现示例,以LRU算法为例: ``` #include <stdio.h> #include <stdlib.h> #define MAX_PAGE_FRAMES 5 // 定义内存中的最大页帧数 int main() { int page_frames[MAX_PAGE_FRAMES]; // 定义页帧数组,表示内存中的页帧 int page_faults = 0; // 记录缺页中断的次数 int pages[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; // 要访问的页面序列 int n_pages = sizeof(pages) / sizeof(pages[0]); // 页面序列的长度 int i, j, k, lru; // 初始化页帧数组为-1 for (i = 0; i < MAX_PAGE_FRAMES; i++) { page_frames[i] = -1; } // 遍历页面序列 for (i = 0; i < n_pages; i++) { int page = pages[i]; int page_found = 0; // 查找页面是否在内存中 for (j = 0; j < MAX_PAGE_FRAMES; j++) { if (page_frames[j] == page) { page_found = 1; break; } } // 如果页面不在内存中 if (!page_found) { page_faults++; // 查找最久未使用的页帧 lru = 0; for (j = 1; j < MAX_PAGE_FRAMES; j++) { if (page_frames[j] < page_frames[lru]) { lru = j; } } // 替换最久未使用的页帧 page_frames[lru] = page; } // 打印当前内存中的页帧 printf("Page Frames: "); for (k = 0; k < MAX_PAGE_FRAMES; k++) { if (page_frames[k] == -1) { printf("[ ] "); } else { printf("[%d] ", page_frames[k]); } } // 打印缺页中断次数 printf("Page Faults: %d\n", page_faults); } return 0; } ``` 在这个程序中,我们使用了一个大小为`MAX_PAGE_FRAMES`的整型数组`page_frames`来模拟内存中的页帧。在程序开始时,我们将`page_frames`数组初始化为-1,表示所有页帧都是空闲的。 接着,我们遍历要访问的页面序列`pages`,对于每个页面,我们首先查找它是否已经在内存中,如果在内存中,我们不需要进行任何操作。否则,我们需要将该页面加载到内存中,并选择最

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值