我是C ++的新手,正在阅读一些在线C ++代码并提出这个问题:
我们何时重载<
运算符,当我们重载()
运算符时,当我们处理用户定义的对象,设置和映射?
类比Java和简单的例子将有很大帮助。提前谢谢。
答案 0 :(得分:3)
何时超载<
运算符
说你有:
struct foo
{
int a;
int b;
};
标准C ++库中有许多容器,例如std::set
和std::map
,仅当有对方法进行排序时才有效。
如果要创建一组foo
个对象,则必须让编译器知道可以调用哪个函数来比较foo
个对象,以便在运行时对它们进行排序。允许对foo
个对象进行排序的一种方法是提供operator<
函数。
struct foo
{
int a;
int b;
bool operator<(const foo& rhs) const;
{
// Add your logic to compare too objects and return true
// if the LHS is deemed to be less than the RHS.
}
};
完成后,您可以构造一组foo
个对象:
std::set<foo> setOfFoo;
何时超载()
运算符
标准C ++库中的许多函数都使用fuctor。仿函数是函数指针或具有()
运算符的结构/类的实例。
例如,标准库函数std::sort
的其中一个版本定义为:
template <class RandomAccessIterator, class Compare>
void sort (RandomAccessIterator first, RandomAccessIterator last, Compare comp);
comp Binary function that accepts two elements in the range as arguments, and returns a value convertible to bool. The value returned indicates whether the element passed as first argument is considered to go before the second in the specific strict weak ordering it defines. The function shall not modify any of its arguments. This can either be a function pointer or a function object.
如果要对foo
中的std::vector
个对象进行排序,则必须执行以下操作:
struct FooCompare
{
bool operator()(foo const& lhs, foo const& rhs)
{
return (lhs < rhs);
}
}
std::vector<foo> fooList;
// Add items to fooList
// Sort fooList
std::sort(fooList.begin(), fooList.end(), FooCompare());
请注意,这只是为了说明()
运算符函数。在现实生活中,您应该能够使用std::less
类来实现此目的。
// Sort fooList
std::sort(fooList.begin(), fooList.end(), std::less<foo>());