2017-06-19 71 views
0

我讀到「庫確保指針類型的較少(和其他函數對象)被很好地定義」。它來自C++ Primer第5版。並且例子是:關於指針類型的STL函數對象

vector <string *> nameTable; 
sort(nameTable.begin(), nameTable.end(), less<string *>()); 

但當我嘗試這個辦法:

string *p1 = new string("abc"); 
string *p2 = new string("abc"); 
cout << equal_to<string *>()(p1, p2); 

它返回0,這意味着假。爲什麼?

編輯:對不起,我閱讀並理解錯誤的書。它說:

vector<string *> nameTable; 
sort(nameTable.begin(), nameTable.end(), [](string *a, string *b) { return a < b; }); // undefined 
sort(nameTable.begin(), nameTable.end(), less<string*>()); // ok. however, meaningless 
+1

指針不同,即使內容比較相等。 – Jarod42

+1

您可以使用'sort(v.begin(),v.end(),少於())'對'vector v'進行排序,但是順序取決於字符串的地址而不是它們的值。 – pschill

回答

6

您的比較將比較指針而不是它們指向的字符串。比較使用<>的指針被指定爲特定執行。使用==!=是指針上唯一明確定義的操作,但它仍然只比較指針。

std::less(以及std::greater等)模板有指針的比較(通過特化)以及指定的含義。但他們仍然比較指針而不是他們指向。

簡單的解決方案? 不要使用指針!

在現代C++中,指針超越多態性的用處很少。指向字符串的指針更少(如果有的話)用於。例外可能是來自C++ 11的智能指針,但是我建議您根據所有權而不是自我刪除指針來看待它們。

+1

也許編輯你的帖子來說**生**指針?智能指針在現代C++中有很多用途 – Curious

1

如果我說*p1 = "def";,這是否改變*p2?如果兩個指針p1p2相等,則意味着它們指的是相同的字符串對象。如果你改變那個單一的字符串對象,那麼是的,*p2也會改變。但是你已經撥了兩次new。你有兩個指向兩個字符串對象的指針。改變一個不會影響另一個。

std::equal<std::string*>告訴你兩個字符串指針是否相等,即指向同一個對象。 std::less<std::string*>是有點任意的順序:當且僅當你有兩個不相等的字符串指針時,一個比另一個小。

(這是「有點任意的」,因爲順序定義爲兩個指針合併爲一個字符串數組。索引最小的字符串的指針將小於指向最高索引字符串的指針)