表驱动法
表驱动法的基本原理是将一组相关的数据存储在一个表格中,然后通过查表的方式来获取所需的结果,而不是通过嵌套的条件判断语句来实现。这样做的好处是可以将逻辑和数据分离,使代码更加清晰简洁。
#include <iostream>
#include <map>
std::string calculate_grade(int score) {
std::map<std::pair<int,int>, std::string> grade_table = {
{{90, 100}, "A"},
{{80, 89}, "B"},
{{70, 79}, "C"},
{{60, 69}, "D"},
{{0, 59}, "E"}
};
for (const auto& entry: grade_table) {
if (score >= entry.first.first && score <= entry.first.second) {
return entry.second;
}
}
return "Invalid score";
}
int main() {
int score = 85;
std::string grade = calculate_grade(score);
std::cout << "The grade for score " << score << " is " << grade << std::endl;
return 0;
}
状态模式
状态模式是一种行为型设计模式,它可以用于解决代码中的条件语句嵌套问题。该模式将对象的状态抽象成独立的类,并将不同状态的行为封装在各自的类中,从而避免了大量的条件判断语句。
#include <iostream>
class State {
public:
virtual void play() = 0;
virtual void pause() = 0;
virtual void stop() = 0;
};
class PlayState : public State {
public:
void play() override {
std::cout << "正在播放音乐" << std::endl;
}
void pause() override {
std::cout << "暂停播放音乐" << std::endl;
}
void stop() override {
std::cout << "停止播放音乐" << std::endl;
}
};
class PauseState : public State {
public:
void play() override {
std::cout << "继续播放音乐" << std::endl;
}
void pause() override {
std::cout << "音乐已经停止" << std::endl;
}
void stop() override {
std::cout << "停止播放音乐" << std::endl;
}
};
class StopState : public State {
public:
void play() override {
std::cout << "开始播放音乐" << std::endl;
}
void pause() override {
std::cout << "音乐已经停止,无法暂停" << std::endl;
}
void stop() override {
std::cout << "音乐已经停止" << std::endl;
}
};
class MusicPlayer {
private:
State* current_state;
public:
MusicPlayer() {
current_state = new StopState();
}
void set_state(State* state) {
current_state = state;
}
void play() {
current_state->play();
set_state(new PlayState());
}
void pause() {
current_state->pause();
set_state(new PauseState());
}
void stop() {
current_state->stop();
set_state(new StopState());
}
};
int main() {
MusicPlayer player;
player.play();
player.pause();
player.play();
player.stop();
return 0;
}
高阶函数
#include <iostream>
#include <vector>
#include <algorithm>
#include <ranges>
int main() {
std::vector<int> vec{1, 2, 3, 4, 5};
auto result = vec
| std::views::filter([](int x){ return x % 2 == 0; })
| std::views::transform([](int x){ return x * x; });
for (auto x: result) {
std::cout << x << " ";
}
std::cout << std::endl;
return 0;
}