运算符() 和运算符< 在C++中有什么区别?
What is the difference between operator() and operator< in C++?
每当我有c++实体,我想比较我只是实现operator<
。然而,在阅读其他人的代码时,我发现同样可以通过实现operator()
来实现。
两者的区别是什么?什么时候应该使用这些操作符?
operator<
是定义比较运算符的规范方式:
struct A { /* some members */ };
struct B { /* some members */ };
// comparison operator
bool operator<(const A&, const B&);
给出了常规用法:
int main()
{
A a;
B b;
const bool result = (a < b);
}
你看到的是人们创建了函子;也就是说,整个类,其唯一目的是封装比较。为了使它们看起来有点像调用代码的函数,它们使用operator()
:
struct A { /* some members */ };
struct B { /* some members */ };
// comparison functor
struct comparator
{
bool operator()(const A&, const B&);
};
这给了你一个不太常规的用法,相当于我前面的例子:
int main()
{
A a;
B b;
comparator c;
const bool result = c(a,b);
}
但是,您不会将其用于此。函子用于传递给算法(特别是在泛型代码中)。它们还有一个额外的好处,即能够保存状态,因为您可以使用构造函数参数。这使得它们比简单的函数指针更灵活。
int main()
{
std::vector<A> a(5);
B b;
comparator c;
std::sort(a.begin(), a.end(), c);
// or, simply:
std::sort(a.begin(), a.end(), comparator());
// all more easily extensible than:
std::sort(a.begin(), a.end(), &someComparisonFunction);
}
相关文章:
- 重载运算符的范围是什么?它是否会影响作为类成员的集合的插入函数?
- 如果我真的真的想从 STL 容器继承,并且我继承构造函数并删除新运算符,会发生什么?
- 这里的 = 运算符有什么用法?
- unique_ptr < 0 或小于运算符做什么?
- "operator()"在重载运算符方法中是什么意思,在priority_queue(STL)中用作C++中的比较器?
- 是什么让一些命名函数/运算符与众不同?
- C++,()运算符重载,它的工作是什么
- 提供运算符+或运算符到双向迭代器有什么缺点吗?
- std::set<Key,Compare,Allocator>::find() 函数使用"<"运算符而不是"=="运算符背后的直觉是什么?
- 有什么理由不扩展 std::set 以添加下标运算符吗?
- 在C++中,运算符 sizeof 返回什么数据类型?
- 运算符++();调用和++(*this)有什么区别?
- 第二个常量在运算符函数中做什么?
- 使输出流式处理运算符适用于 boost::variant<std::vector<int>、int、double 的正确方法是什么>
- 当值传递给C++中的运算符重载函数时会发生什么
- 除了调用全局删除运算符之外,删除一个void指针还能做什么呢
- c++运算符重载-我实际返回的操作数类型是什么
- 这个typedef和转换运算符语法是什么意思
- 当正斜杠运算符应用于C++中的字符串类型时,它会做什么
- 运算符和返回类型是什么意思?