我是新的C++,是讀了一些網上的C++代碼,並有這樣的疑問:關於C++ STL的查詢?
我們什麼時候超載<
運營商,當我們重載()
運營商,當我們面對的是用戶定義的對象,設置和地圖?
與Java和簡單的例子類比將有很大的幫助。提前致謝。
我是新的C++,是讀了一些網上的C++代碼,並有這樣的疑問:關於C++ STL的查詢?
我們什麼時候超載<
運營商,當我們重載()
運營商,當我們面對的是用戶定義的對象,設置和地圖?
與Java和簡單的例子類比將有很大的幫助。提前致謝。
當重載<
操作
假設你有:
struct foo
{
int a;
int b;
};
有許多容器,如std::set
並且僅在該工作的標準C++庫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許多功能++與fuctors圖書館工作。函數是函數指針或者是一個結構/類的實例,它有一個()
運算符。
舉例來說,標準庫函數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>());
要將此鏈接到ISO標準規範,您需要重載'operator()'以滿足'Callable'對象的要求,''LessThanComparable'則需要'operator <'。 – Potatoswatter
這個問題是關於話題的。甚至有一部分專用於它的標準,§17.6.3.1[utility.arg.requirements]。 – Potatoswatter