map + function 实现替代if - else

简介: 代码更简洁:使用map + function可以将多个if-else语句转化为一行代码,使得代码看起来更加简洁易懂。可读性更好:使用map + function可以将判断逻辑抽象成函数,让代码更具可读性和可维护性。

使用map + function 的方式替代if-else有以下好处:


  1. 代码更简洁:使用map + function可以将多个if-else语句转化为一行代码,使得代码看起来更加简洁易懂。


  1. 可读性更好:使用map + function可以将判断逻辑抽象成函数,让代码更具可读性和可维护性。


  1. 易于扩展:当需要添加新的判断条件时,只需要在函数中增加新的分支即可,而不需要修改大量的if-else语句。


  1. 更高的性能:使用map + function可以利用函数式编程的特性,让代码更加高效。相比较于if-else语句,map + function可以更快地进行处理。


总之,使用map + function的方式可以让代码更加简洁、易读、易扩展,并且具有更高的性能表现。


#include <iostream>
#include <map>
using namespace std;
// 定义函数指针类型
typedef int (*funcPtr)(int);
// 定义函数实现
int func1(int x) {
    return x * 2;
}
int func2(int x) {
    return x + 10;
}
int func3(int x) {
    return x - 5;
}
int main() {
    // 初始化一个map,键为整数,值为相应的函数指针
    map<int, funcPtr> myMap = {{1, &func1}, {2, &func2}, {3, &func3}};
    // 测试输入值和对应的函数编号
    int x = 5;
    int funcNum = 1;
    // 使用map和函数指针调用相应的函数
    int result = (*myMap[funcNum])(x);
    cout << "The result is " << result << endl;
    return 0;
}
#include <iostream>
#include <map>
using namespace std;
// 定义函数指针类型
typedef int (*funcPtr)(int);
// 定义函数实现
int func1(int x) {
    return x * 2;
}
int func2(int x) {
    return x + 10;
}
int func3(int x) {
    return x - 5;
}
int main() {
    // 初始化一个map,键为整数,值为相应的函数指针
    map<int, funcPtr> myMap = {{1, &func1}, {2, &func2}, {3, &func3}};
    // 测试输入值和对应的函数编号
    int x = 5;
    int funcNum = 1;
    // 使用map和函数指针调用相应的函数
    int result = (*myMap[funcNum])(x);
    cout << "The result is " << result << endl;
    return 0;
}


在这个示例代码中,我们首先定义了三个函数func1、func2和func3来模拟不同的处理逻辑。然后我们使用一个map来将输入值和相应的函数指针关联起来。最后,我们根据输入的函数编号从map中取出相应的函数指针,并通过指针调用相应的函数来得到结果。


通过使用map + function的方式,我们可以避免使用大量的if-else语句,在代码简洁性、可读性、可维护性和性能方面都表现较好。

整理内容

C++中的映射是用于存储键值对的非常有用的数据结构。映射是存储的最佳方式,我们可以使用具有最佳时间复杂度的键直接查找和访问值。


但是,您是否知道您也可以将函数存储为C++映射中的值?没错 - 可以使用映射来存储和快速访问需要在程序中不同时间调用的一组函数。让我们检查一下函数图。


C++中的映射是用于存储键值对的非常有用的数据结构。映射是存储的最佳方式,我们可以使用具有最佳时间复杂度的键直接查找和访问值。


但是,您是否知道您也可以将函数存储为C++映射中的值?没错 - 可以使用映射来存储和快速访问需要在程序中不同时间调用的一组函数。让我们检查一下函数图。


语法:


std::function var_name;


在此代码中,return_type是函数的返回类型,arg_type1、_arg_type2_等。是函数参数的类型。


要创建函数映射,我们首先需要定义要使用的函数签名。在这种情况下,我们希望存储接受两个长参数并返回长值的函数。我们可以使用函数头文件中的函数模板来定义一个可以存储此类函数的变量:


// first create a function template
using func=function<long(long,long)>;
// create a map object
unordered_map<string,func> mp{
    {"+", plus<long>()},
    {"-", minus<long>()},
    {"/", divides<long>()},
    {"*", multiplies<long>()}
};


在此代码中,函数加、减、除和乘分别使用字符串键 “+”、“-”、“/”和“ * ”添加到映射对象映射中。


若要调用存储在映射中的函数,可以使用数组访问运算符 [] 检索函数指针,并使用函数调用运算符 () 调用函数。

例如:


long result = map["+"](2, 3);   //  5
long result1 = map["-"](2, 3);  // -1
long result2= map["*"](2, 3);   //  6
long result3 = map["/"](6, 3);  //  2


使用映射存储函数有几个优点。它允许您在运行时轻松添加或删除函数,还允许您轻松地将名称与每个函数相关联,这样可以更轻松地理解和维护代码。让我们用一个问题来理解它。


问题陈述:

您已经获得了一个称为标记的字符串数组,这些字符串表示用反向波兰表示法 (RPN) 编写的算术表达式。您的任务是计算此表达式并以整数形式返回结果。每个操作数可以是整数或其他 RPN 表达式。当除以两个整数时,结果将始终被截断为零。您可以假设输入表示有效的 RPN 表达式,并且不会有任何除以零。


让我们检查一些测试用例以了解。


案例1:


Input: ["2", "1", "+", "3", "*"]
Output: 9
Explanation: ((2 + 1) * 3) = 9


案例2:


Input: ["10", "6", "9", "3", "+", "-11", "*", "/", "*", "17", "+", "5", "+"]
Output: 22
Explanation: ((10 * (6 / ((9 + 3) * -11))) + 17) + 5 = 22


例:


// C++ Program to implement
// map of functions
#include <bits/stdc++.h>
using namespace std;
// Define a type alias for a function that takes two longs
// and returns a long
using func = function<long(long, long)>;
// Create a map that maps strings to functions
map<string, func> mp{
  // Plus function from functools
  { "+", plus<long>() },
  // Minus function from functools
  { "-", minus<long>() },
  // Divides function from functools
  { "/", divides<long>() },
  // Multiplies function from functools
  { "*", multiplies<long>() }
};
// Function to evaluate a Reverse Polish Notation (RPN)
// expression
int evalRPN(vector<string>& A)
{
  // Create a stack to store the operands
  stack<long> s;
  // Iterate over the elements in the RPN expression
  for (auto i : A) {
  // If the element is not an operator, it is an
  // operand Convert it to an integer and push it onto
  // the stack
  if (!mp[i]) {
    s.push(stoi(i));
  }
  // If the element is an operator, pop the top two
  // operands from the stack Perform the operation and
  // push the result back onto the stack
  else {
    auto num1 = s.top();
    s.pop();
    auto num2 = s.top();
    s.pop();
    s.push(mp[i](num2, num1));
  }
  }
  // Return the result, which is the top element of the
  // stack
  return s.top();
}
int main()
{
  // Test the evalRPN function with an RPN expression
  vector<string> A
  = { "10", "6", "9", "3", "+", "-11", "*",
    "/", "*", "17", "+", "5", "+" };
  int answer = evalRPN(A);
  cout << answer << endl;
  return 0;
}


时间复杂度:O(N) // 这里 N 是向量 A 的大小;


**辅助空间:**O(N)。

目录
相关文章
|
1月前
|
Python
python中的map(function, iterable...)
【4月更文挑战第4天】`map()`是Python内置函数,用于对一个或多个可迭代对象的每个元素应用指定函数,返回一个迭代器。基本语法是`map(function, iterable, ...)`。示例中,定义函数`multiply_by_two(x)`将元素乘以2,`map()`将此函数应用于列表`numbers`,返回迭代器`doubled_numbers`,需通过`list()`转为列表显示结果,输出为[2, 4, 6, 8, 10]。注意,`map()`返回的是迭代器而非列表。
13 0
python中的map(function, iterable...)
|
3天前
|
JavaScript 前端开发
在JavaScript中,函数原型(Function Prototype)是一个特殊的对象
【5月更文挑战第11天】JavaScript中的函数原型是一个特殊对象,它为所有函数实例提供共享的方法和属性。每个函数在创建时都有一个`prototype`属性,指向原型对象。利用原型,我们可以向所有实例添加方法和属性,实现继承。例如,我们定义一个`Person`函数,向其原型添加`greet`方法,然后创建实例`john`和`jane`,它们都能调用这个方法。尽管可以直接在原型上添加方法,但推荐在构造函数内部定义以封装数据和逻辑。
10 2
|
7天前
|
存储 算法 对象存储
【C++入门到精通】function包装器 | bind() 函数 C++11 [ C++入门 ]
【C++入门到精通】function包装器 | bind() 函数 C++11 [ C++入门 ]
14 1
|
13天前
|
存储
function(函数)
在 Lua 中,函数作为第一类值可存储于变量,如示例所示:`factorial1` 和 `factorial2` 存储相同函数。此外,函数可作为参数传递,如 `testFun` 接收一个表和一个匿名函数,该匿名函数在迭代中处理键值对,输出 `key1=val1` 和 `key2=val2`。
|
15天前
|
JavaScript 前端开发
【专栏】`Function.prototype.apply` 在JavaScript中用于动态设定函数上下文(`this`)和参数列表
【4月更文挑战第29天】`Function.prototype.apply` 在JavaScript中用于动态设定函数上下文(`this`)和参数列表。它接受两个参数:上下文对象和参数数组。理解`apply`有助于深入JS运行机制。文章分三部分探讨其原理:基本概念和用法、工作原理详解、实际应用与注意事项。在应用中要注意性能、参数类型和兼容性问题。`apply`可用于动态改变上下文、传递参数数组,甚至模拟其他语言的调用方式。通过深入理解`apply`,能提升代码质量和效率。
|
17天前
|
Serverless 应用服务中间件 数据安全/隐私保护
Serverless 应用引擎操作报错合集之在阿里函数计算中,函数执行超时,报错Function time out after如何解决
Serverless 应用引擎(SAE)是阿里云提供的Serverless PaaS平台,支持Spring Cloud、Dubbo、HSF等主流微服务框架,简化应用的部署、运维和弹性伸缩。在使用SAE过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
19 4
|
1月前
|
资源调度 Serverless 计算机视觉
高斯函数 Gaussian Function
**高斯函数,或称正态分布,以数学家高斯命名,具有钟形曲线特征。关键参数包括期望值μ(决定分布中心)和标准差σ(影响分布的宽度)。当μ=0且σ²=1时,分布为标准正态分布。高斯函数广泛应用于统计学、信号处理和图像处理,如高斯滤波器用于图像模糊。其概率密度函数为e^(-x²/2σ²),积分结果为误差函数。在编程中,高斯函数常用于创建二维权重矩阵进行图像的加权平均,实现模糊效果。
23 1
|
2月前
|
算法 Serverless C语言
CMake函数和宏(function和macro):使用函数和宏提高代码可读性
CMake函数和宏(function和macro):使用函数和宏提高代码可读性
35 1
|
2月前
|
存储 安全 编译器
【C++ 包装器类 std::function 和 函数适配器 std::bind】 C++11 全面的std::function和std::bind的入门使用教程
【C++ 包装器类 std::function 和 函数适配器 std::bind】 C++11 全面的std::function和std::bind的入门使用教程
34 0
|
2月前
|
SQL Oracle 关系型数据库
Flink的表值函数(Table-Valued Function,TVF)是一种返回值是一张表的函数
【2月更文挑战第17天】Flink的表值函数(Table-Valued Function,TVF)是一种返回值是一张表的函数
25 1

热门文章

最新文章