做素食香料哪个网站买,网页制作东莞,怎么用id导入wordpress,很多卖假药冒产品用二级域名做网站functional模块介绍
functional模块是C 11提供了一组函数对象和算法#xff0c;用于增强C的函数式编程能力。该模块中的函数对象和算法可以大大简化代码#xff0c;并提供了一些有用的工具#xff0c;例如函数适配器和函数对象的组合。
functional模块中的函数对象包括 11提供了一组函数对象和算法用于增强C的函数式编程能力。该模块中的函数对象和算法可以大大简化代码并提供了一些有用的工具例如函数适配器和函数对象的组合。
functional模块中的函数对象包括
plus加法函数对象用于将两个参数相加。minus减法函数对象用于将第一个参数减去第二个参数。multiplies乘法函数对象用于将两个参数相乘。divides除法函数对象用于将第一个参数除以第二个参数。modulus取模函数对象用于返回第一个参数除以第二个参数的余数。negate取反函数对象将参数取反。
functional模块中的算法包括
bind将一个函数对象和一些参数绑定在一起生成一个新的函数对象。mem_fn将一个成员函数包装成函数对象。not1对一个函数对象进行逻辑非运算。ref将一个对象包装成一个引用包装器。cref将一个对象包装成一个const引用包装器。
使用案例
案例一
#include iostream
#include functionalint main() {std::plusint plusFunc;int result plusFunc(1, 2); // 将1和2相加返回3std::cout result std::endl;return 0;
}
在上面的例子中我们创建了一个std::plusint的实例plusFunc该实例可以用于将两个整数相加。然后我们调用plusFunc函数对象传入参数1和2并将返回的结果赋值给result变量。最后我们将结果输出到控制台得到的输出结果是3。
使用std::plus函数对象的好处是它可以与其他函数对象和算法结合使用例如使用std::transform算法对一个容器中的元素进行相加操作
#include iostream
#include functional
#include vector
#include algorithmint main() {std::vectorint nums {1, 2, 3, 4, 5};std::vectorint result(nums.size());std::transform(nums.begin(), nums.end(), nums.begin(), std::negateint());std::transform(nums.begin(), nums.end(), result.begin(), std::bind(std::plusint(), std::placeholders::_1, 2));for (int num : result) {std::cout num ;}return 0;
}
在上面的例子中我们首先使用std::transform算法和std::negate函数对象对nums容器中的元素进行取反操作。然后使用std::transform算法和std::bind函数将nums中的每个元素与2相加并将结果存储在result容器中。最后我们遍历result容器并输出每个元素的值。输出结果为-1 0 1 2 3表示nums中的每个元素都加上了2。
这个例子展示了std::plus函数对象的灵活性它可以与其他函数对象和算法结合使用简化了代码并提供了更好的可读性和可维护性。
案例二
#include iostream
#include functionalint add(int a, int b) {return a b;
}int subtract(int a, int b) {return a - b;
}int main() {std::functionint(int, int) func1 add;std::functionint(int, int) func2 std::bind(subtract, std::placeholders::_2, std::placeholders::_1);int result1 func1(1, 2); // 调用add函数返回3int result2 func2(2, 1); // 调用subtract函数返回1std::cout result1 std::endl;std::cout result2 std::endl;return 0;
}
在上面的例子中我们定义了两个函数add和subtract并使用std::function将它们包装成函数对象func1和func2。然后我们可以像调用普通函数一样使用这些函数对象通过调用func1和func2来执行对应的函数。输出结果分别为3和1。
在这个例子中我们使用了bind函数将subtract函数的两个参数绑定在一起然后通过调整参数的顺序来实现减法运算。这是functional模块中的一个常见用法可以用来生成新的函数对象。
案例三
#include iostream
#include functionalclass MyClass {
public:void printMessage(const std::string message) {std::cout message std::endl;}
};int main() {MyClass obj;auto printFunc std::mem_fn(MyClass::printMessage);printFunc(obj, Hello, world!); // 调用obj对象的printMessage函数并传入参数Hello, world!return 0;
}
在上面的例子中我们定义了一个名为MyClass的类该类具有一个成员函数printMessage用于输出一条消息。然后我们创建了一个MyClass类型的对象obj并使用std::mem_fn将printMessage函数转化为一个函数对象printFunc。最后我们调用printFunc函数对象传入obj对象和字符串参数Hello, world!从而调用了obj对象的printMessage函数并输出了消息。
使用std::mem_fn函数对象的好处是它允许我们以通用的方式处理成员函数指针和成员函数对象可以与其他函数对象和算法结合使用。例如我们可以通过std::transform算法将一个容器中的每个元素调用成员函数并获取结果
#include iostream
#include functional
#include vector
#include algorithmclass MyClass {
public:int multiply(int x, int y) {return x * y;}
};int main() {std::vectorint nums {1, 2, 3, 4, 5};std::vectorint result(nums.size());MyClass obj;auto multiplyFunc std::mem_fn(MyClass::multiply);std::transform(nums.begin(), nums.end(), result.begin(), std::bind(multiplyFunc, obj, std::placeholders::_1, 2));for (int num : result) {std::cout num ;}return 0;
}
在上面的例子中我们定义了一个名为MyClass的类该类具有一个成员函数multiply用于计算两个整数的乘积。然后我们创建了一个MyClass类型的对象obj并使用std::mem_fn将multiply函数转化为一个函数对象multiplyFunc。最后我们使用std::transform算法和std::bind函数将nums容器中的每个元素和数字2传入multiplyFunc函数对象中进行计算并将结果存储在result容器中。最后我们遍历result容器并输出每个元素的值。输出结果为2 4 6 8 10表示nums中的每个元素都乘以了2。
这个例子展示了std::mem_fn函数对象的灵活性它允许我们处理成员函数指针和成员函数对象并与其他函数对象和算法结合使用简化了代码并提供了更好的可读性和可维护性。
案例四
#include iostream
#include functionalvoid updateValue(int value) {value 10;
}int main() {int num 5;std::cout Before update: num std::endl;std::functionvoid() updateFunc std::bind(updateValue, std::ref(num));updateFunc();std::cout After update: num std::endl;return 0;
}
在上面的例子中我们定义了一个名为updateValue的函数该函数接受一个引用参数并将其值增加10。然后我们创建了一个名为num的整数变量初始值为5。接下来我们使用std::ref函数模板将num对象转化为一个引用包装器并通过std::bind函数将updateValue函数与引用包装器绑定到一起创建一个函数对象updateFunc。最后我们调用updateFunc函数对象从而实际调用了updateValue函数并传递了num对象的引用作为参数。输出结果为
Before update: 5
After update: 15
可以看到通过使用std::ref函数模板我们可以在函数调用中传递对象的引用从而实现对对象的修改。
案例五
#include iostream
#include functionalvoid printValue(const int value) {std::cout Value: value std::endl;
}int main() {int num 10;std::functionvoid() printFunc std::bind(printValue, std::cref(num));printFunc();return 0;
}
在上面的例子中我们定义了一个名为printValue的函数该函数接受一个常量引用参数并打印该值。然后我们创建了一个名为num的整数变量初始值为10。接下来我们使用std::cref函数模板将num对象转化为一个常量引用包装器并通过std::bind函数将printValue函数与常量引用包装器绑定到一起创建一个函数对象printFunc。最后我们调用printFunc函数对象从而实际调用了printValue函数并传递了num对象的常量引用作为参数。输出结果为
Value: 10
可以看到通过使用std::cref函数模板我们可以在函数调用中传递对象的常量引用从而实现对对象的只读访问。
案例六
#include iostream
#include functional
#include vector
#include algorithmbool isOdd(int num) {return num % 2 ! 0;
}int main() {std::vectorint nums {1, 2, 3, 4, 5};std::vectorint evenNums;std::copy_if(nums.begin(), nums.end(), std::back_inserter(evenNums), std::not1(std::ptr_fun(isOdd)));for (int num : evenNums) {std::cout num ;}std::cout std::endl;return 0;
}
在上面的例子中我们定义了一个名为isOdd的谓词函数该函数接受一个整数参数并判断该整数是否为奇数。然后我们创建了一个整数类型的vector容器nums并使用std::copy_if算法和std::not1函数模板将nums容器中的所有偶数元素复制到另一个vector容器evenNums中。在调用std::copy_if算法时我们使用std::not1函数模板将isOdd谓词函数进行否定操作从而实现对偶数元素的筛选。最后我们遍历evenNums容器并输出其中的所有元素。输出结果为
2 4
这个例子展示了std::not1函数模板的用途可以对谓词函数进行否定操作从而实现相反的逻辑判断。在实际开发中std::not1函数模板可以用于各种需要对谓词函数进行逻辑反操作的场景例如在STL算法中对元素进行筛选、排序或处理等操作。