[英]STL Function Objects on pointer types
我讀到“庫保證指針類型上的更少(和其他函數對象)定義得很好”。 它來自C ++ Primer 5版。 例子是:
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,表示false。 為什么?
編輯:對不起,我讀錯了書。 它說:
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
您的比較將比較指針而不是它們指向的字符串。 使用<
或>
比較指針被指定為實現特定的 。 使用==
和!=
是對指針的唯一定義明確的操作,但仍僅比較指針。
std::less
(以及std::greater
等)模板確實具有明確指定的含義,用於比較指針(通過專業化)。 但是他們仍然比較指針,而不是指針 。
簡單的解決方案? 不要使用指針!
在現代C ++中,除了多態性之外,很少使用指針。 指向字符串的指針甚至更少(如果有)用於。 例外可能是C ++ 11的智能指針,但是我建議您從所有權而不是自刪除指針的角度來看它們。
如果我說*p1 = "def";
,這會改變*p2
嗎? 如果兩個指針p1
和p2
相等,則意味着它們指向同一字符串object 。 而且,如果您更改單個字符串對象,那么可以, *p2
也將更改。 但是您打過兩次new
。 您有兩個指向兩個字符串對象的指針。 更改一個不會影響另一個。
std::equal<std::string*>
告訴您兩個字符串指針是否相等,即引用同一對象。 std::less<std::string*>
在某種程度上是任意的:當且僅當您有兩個不相等的字符串指針時,一個小於另一個。
(這是“某種程度的任意性”,因為對於指向單個字符串數組的兩個指針,順序是明確定義的。指向具有最低索引的字符串的指針將小於指向具有最高索引的字符串的指針)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.