C语言八股
数据结构:
结构体与联合体的区别?
结构体每个成员变量的内存都是独立的,联合体的成员变量的内存空间存在覆盖的情况
一个结构体的大小,也就是用sizeof运算符得到的结果,是每个成员变量的大小进行对齐并填充字节之后的总的大小。
联合体的大小则是其中一个占用内存空间最大的成员变量的大小,内存占用是共享的,不适合需要同时对多个成员变量进行使用的场景。
仿函数(Functor)是一种重载了函数调用运算符 operator()
的类对象,使其具有函数的行为。它可以像函数一样被调用,接受参数并返回结果。在 C++ 中,仿函数可以作为函数对象(Function Object)用于实现函数指针的替代,并可以通过重载 operator()
来自定义函数行为。
使用仿函数的优点在于它可以存储状态并在每次调用时保留该状态。这使得可以在代码中使用可调用对象来记录和处理某些特定的操作或算法。
使用仿函数,你可以实现不同的功能,如:
- 自定义的比较器:可以使用仿函数来定义自己的比较逻辑,例如在容器排序中指定自定义的排序准则。
- 函数对象作为算法的参数:一些 STL 算法,如
std::sort
,可以接受函数对象作为参数,使用仿函数可以方便地为这些算法提供自定义的行为。 - 状态的保存:仿函数可以保持状态,因此你可以在多次调用中存储和使用状态信息。
下面是一个简单的示例,使用仿函数来实现一个自定义的加法运算:
struct MyAddition
{
int operator()(int a, int b)
{
return a + b;
}
};
int main()
{
MyAddition add;
int result = add(3, 4); // 调用仿函数
// result 现在等于 7
return 0;
}
在上面的示例中,MyAddition
是一个仿函数类,重载了函数调用运算符 operator()
,将两个整数相加并返回结果。我们创建了一个 MyAddition
对象 add
,并像调用函数一样使用它,将两个整数传递给它,并得到返回的结果。
需要注意的是,仿函数类可以包含其他成员变量或成员函数,这可以用于存储更多的状态信息,并在每次调用时使用。同时仿函数还可以是模板类,以支持不同类型的参数和返回值。
总而言之,仿函数是一种在 C++ 中实现函数对象的机制,它提供了灵活和可自定义的函数行为。通过重载函数调用运算符 operator()
,可以使仿函数的对象像普通函数一样进行调用,从而方便地将其用于各种场景,如排序、搜索、累加等。