MST

星途 面试题库

面试题:C++消息映射:复杂场景下的优化

在一个大型C++项目中,消息映射涉及众多消息类型和复杂的层次结构。假设存在消息优先级的需求,如何在现有消息映射机制基础上进行优化,以确保高优先级消息优先处理?请详细阐述设计思路和关键代码片段。
35.6万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试

设计思路

  1. 优先级定义:为每个消息类型分配一个优先级值,例如,定义一个枚举类型来表示不同消息的优先级。
  2. 优先级队列:使用一个优先级队列(如std::priority_queue)来存储接收到的消息。优先级队列会自动根据消息的优先级进行排序,保证高优先级消息在队列头部。
  3. 消息分发:在消息处理循环中,从优先级队列中取出消息并进行分发处理。

关键代码片段

#include <iostream>
#include <queue>
#include <functional>
#include <unordered_map>

// 定义消息类型
enum class MessageType {
    MESSAGE_TYPE_1,
    MESSAGE_TYPE_2,
    // 更多消息类型
};

// 定义消息优先级
enum class MessagePriority {
    HIGH,
    MEDIUM,
    LOW
};

// 定义消息结构体
struct Message {
    MessageType type;
    MessagePriority priority;
    // 其他消息数据
    Message(MessageType t, MessagePriority p) : type(t), priority(p) {}
};

// 定义优先级队列的比较函数,让高优先级的消息排在前面
struct CompareMessage {
    bool operator()(const Message& a, const Message& b) {
        return static_cast<int>(a.priority) < static_cast<int>(b.priority);
    }
};

// 消息映射表,用于存储不同类型消息的处理函数
using MessageHandler = void(*)(const Message&);
std::unordered_map<MessageType, MessageHandler> messageMap;

// 注册消息处理函数
void registerMessageHandler(MessageType type, MessageHandler handler) {
    messageMap[type] = handler;
}

// 处理消息
void handleMessage(const Message& msg) {
    auto it = messageMap.find(msg.type);
    if (it != messageMap.end()) {
        it->second(msg);
    } else {
        std::cout << "No handler for message type." << std::endl;
    }
}

int main() {
    // 注册消息处理函数
    registerMessageHandler(MessageType::MESSAGE_TYPE_1, [](const Message& msg) {
        std::cout << "Handling MESSAGE_TYPE_1 with priority: ";
        if (msg.priority == MessagePriority::HIGH) std::cout << "HIGH" << std::endl;
        else if (msg.priority == MessagePriority::MEDIUM) std::cout << "MEDIUM" << std::endl;
        else std::cout << "LOW" << std::endl;
    });

    // 模拟接收消息并放入优先级队列
    std::priority_queue<Message, std::vector<Message>, CompareMessage> messageQueue;
    messageQueue.push(Message(MessageType::MESSAGE_TYPE_1, MessagePriority::LOW));
    messageQueue.push(Message(MessageType::MESSAGE_TYPE_1, MessagePriority::HIGH));

    // 处理消息
    while (!messageQueue.empty()) {
        Message msg = messageQueue.top();
        messageQueue.pop();
        handleMessage(msg);
    }

    return 0;
}

在上述代码中:

  1. Message结构体表示消息,包含消息类型和优先级。
  2. CompareMessage结构体定义了优先级队列的比较逻辑,确保高优先级消息排在队列头部。
  3. messageMap是一个无序映射,用于存储不同消息类型对应的处理函数。
  4. registerMessageHandler函数用于注册消息处理函数。
  5. handleMessage函数根据消息类型从messageMap中查找并调用对应的处理函数。
  6. main函数中,模拟了接收消息、放入优先级队列以及处理消息的过程。