在一些std
庫template
的參數,一個需要定義他/她自己的功能比較less(a, b)
,more(a, b)
然後std::some_template<T, *, myComparator()>
,但是爲什麼呢?爲什麼我們仍然需要我們自己定義的功能比較
0
A
回答
5
比較器的目的是允許排序的stl容器中的對象排序。如果默認的比較器不適合容器所容納的對象類型,則只需要提供自己的比較器。
例如,如果您要製作以下struct
的std :: set,那麼您需要編寫自己的比較器。
struct Person
{
std::string first_name, last_name, phone_number;
}
默認比較器知道如何比較數字和字符串,但它不知道如何比較Person對象。這是如何編寫自定義比較器來按last_name排序Person對象的。
struct Person_Comparator
{
bool operator()(const Person &a, const Person &b) const {
return a.last_name < b.last_name;
}
};
1
又如讓讓一組具有一些不同的標準
int main()
{
//By default set will use std::less<int>()
//Lets make a set based on no. of 1's in binary representation of elements
set<int,mycomp> s;
for(auto i=1;i<20;i++) //Note :Duplicates 1's representation will be discarded
s.insert(i);
for(auto i:s)
cout<<i<< " "; //19 15 8 7 3 1
return 0;
}
以及相應的比較會像下面:
struct mycomp
{
bool operator()(const int& a, const int& b) const {
auto count_bits = [](long n){
unsigned int c;
for (c = 0; n; c++)
n &= n - 1;
return c;
};
return count_bits(a) != count_bits(b);
}
};
0
我們仍然偶爾也需要我們自己定義的函數比較器在泛型編程中,但我們並不總是需要自己編寫:)你可以使用這個在線嚮導[http://www.xochellis.org/genericdataordering/wizard .php],以創建嚴格的弱命令函子,或者你需要的lambda。
例如,在上一個答案的示例Person_Comparator
中,您只需填寫嚮導窗體中的三個字段,如this picture所示。
欲瞭解更多詳細信息,您可以參考here還有:
最好的問候, 吉姆Xochellis
相關問題
- 1. PHP:爲什麼我們需要字符串比較功能?
- 2. 爲什麼我們需要crossCheckMatching功能?
- 3. 雖然我們有Swing,但爲什麼我們需要JavaFX?
- 4. 爲什麼我們自己需要合併幾何?
- 5. DavLockDB:我們需要什麼?
- 6. 爲什麼我們需要.htaccess的worpdress?
- 7. in solrImportScheduler爲什麼我們需要爲delta導入定義reBuildIndexBeginTime?
- 8. 爲什麼我們不能創建我們自己的ostream對象
- 9. 什麼是仿函數,爲什麼我們需要它們?
- 10. 什麼是EJB回調,爲什麼我們需要它們?
- 11. 裝配需要什麼?爲什麼我們使用它們?
- 12. 爲什麼我們需要analysis_export當我們有analysis_port
- 13. 當我們有點子時,爲什麼我們需要Anaconda?
- 14. 爲什麼我們需要simple_one_for_one?
- 15. 爲什麼我們需要TensorFlow tf.Graph?
- 16. 爲什麼我們需要使用prompt.start()?
- 17. 爲什麼我們需要scalaz.stream迭代?
- 18. 爲什麼我們需要WCF
- 19. 爲什麼我們需要Anaconda 2.7?
- 20. 爲什麼我們需要編寫log.isDebugEnabled?
- 21. 爲什麼我們需要ng-click?
- 22. 爲什麼我們需要Control.Lens.Reified?
- 23. 我們爲什麼需要纖維
- 24. 爲什麼我們需要org.junit.ComparisonFailure?
- 25. 爲什麼我們需要addRequestHeader方法?
- 26. 爲什麼我們需要時代?
- 27. 爲什麼我們需要ContinueWith方法?
- 28. 爲什麼我們需要Java NIO Selector?
- 29. 爲什麼我們需要使用ExitWindowsEx
- 30. 爲什麼我們需要包裝類
什麼是 「STL」? – 2013-07-27 14:17:45
所有的大多數都有它們的默認比較器。 它全部在程序員的意圖 – P0W
@ H2CO3我不知道該給這個詞打什麼電話,這就是爲什麼我只是稱它爲stl,對不起 – mr5