面试题答案
一键面试设计思路
- 优先级定义:为每个消息类型分配一个优先级值,例如,定义一个枚举类型来表示不同消息的优先级。
- 优先级队列:使用一个优先级队列(如
std::priority_queue
)来存储接收到的消息。优先级队列会自动根据消息的优先级进行排序,保证高优先级消息在队列头部。 - 消息分发:在消息处理循环中,从优先级队列中取出消息并进行分发处理。
关键代码片段
#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;
}
在上述代码中:
Message
结构体表示消息,包含消息类型和优先级。CompareMessage
结构体定义了优先级队列的比较逻辑,确保高优先级消息排在队列头部。messageMap
是一个无序映射,用于存储不同消息类型对应的处理函数。registerMessageHandler
函数用于注册消息处理函数。handleMessage
函数根据消息类型从messageMap
中查找并调用对应的处理函数。- 在
main
函数中,模拟了接收消息、放入优先级队列以及处理消息的过程。