使用函子和函数指针有什么区别.例如
//Functor
struct add_x
{
int x;
add_x(int y):x(y){}
int operator()(int y)
{
return x+y;
}
};
//Function
int (func)(int x)
{
return ++x;
}
std::vector<int> vec();
//fill vec with 1 2 3 4 5
int (*f)(int) = func;//Function pointer
std::transform(vec.begin(),vec.end(),f); //approach 1
std::transform(vec.begin(),vec.end(),add_x(1)); //approach 2
Run Code Online (Sandbox Code Playgroud)
这两种方法都有效,但我确信会有一种方法比其他方法更受欢迎(或可能).
这两段代码做同样的事情.如您所见,它将用于排序功能.哪个更好?我通常写后一个.但是我看到有些编码员会像前者那样做.
struct val_lessthan : binary_function<pair<string,int>, pair<string, int>, bool>
{
bool operator() (const pair<string,int>& x, const pair<string,int>& y) const
{
return x.second < y.second;
}
} val_lt;
Run Code Online (Sandbox Code Playgroud)
和
bool val_lt(const pair<string,int>& x, const pair<string,int>& y)
{
return x.second < y.second;
}
Run Code Online (Sandbox Code Playgroud)
将使用它像:
std::sort(wordvector.begin(), wordvector.end(), val_lt);
Run Code Online (Sandbox Code Playgroud) 由于编译器更容易内联函数,因此函数显然更有效,并且它们在参数化方面的工作效果更好.什么时候应该使用普通的旧函数而不是函子?
我想知道inline当一个函数作为一个函数传递时,C++是否仍然会遵守该关键字.在下面的示例中,是否会在循环中调用onFrame每次推送到堆栈的新帧?frame()while
bool interrupt = false;
void run(std::function<void()> frame) {
while(!interrupt) frame();
}
inline void onFrame() {
// do something each frame
}
int main() {
run(onFrame);
}
Run Code Online (Sandbox Code Playgroud)
或者改变这个有什么影响?
void run(std::function<inline void()> frame) {
while(!interrupt) frame();
}
Run Code Online (Sandbox Code Playgroud)
如果你没有明确的答案,你能帮我找到一种测试方法吗?可能使用内存地址或某种调试器?
我的作业如下:
对于给定的整数数组,找到其元素的总和并打印出最终结果,但是为了获得总和,您需要在STL中仅执行一次函数for_each()(没有循环).
截至目前这是我的代码:
void myFunction (int i) {
cout << " " << i << " " << endl;
}
int main() {
int array[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
vector<int> v(array[0], array[10]);
for_each( v.begin(), v.end(), myFunction);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但由于某种原因,输出显示为4198853,起初我认为它是一个内存地址,但我发现这是错误的.有什么想法,我可能做错了什么?
为什么不是一个仿函数而不是像下面的myless这样的模板化函数?为什么委员会决定这一点以及我可以在哪里进一步阅读?C++ 11标准也解释了为什么委员会做出了某些决定?
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
#if 1
template <class T> struct stdless {
bool operator() (const T& x, const T& y) const {return x<y;}
typedef T first_argument_type;
typedef T second_argument_type;
typedef bool result_type;
};
#else
#define stdless std::less
#endif
//bool myless(int a, int b) { return a<b; }
template<class T>
bool myless(T a, T b) { return a<b; }
int main()
{
vector<int> a{5, 3, 1,6};
myless(5, 6);
stdless<int>()(5, 6);
auto fn1=stdless<int>();
fn1(5,9);
auto …Run Code Online (Sandbox Code Playgroud)