指针类型的 STL 函数对象

STL Function Objects on pointer types

我读到 "library guarantees that less (and other function objects) on pointer types is well defined"。它来自 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);

它returns 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

您的比较将比较 指针 而不是它们指向的字符串。使用 <> 比较指针被指定为 实现特定 。使用 ==!= 是唯一明确定义的指针操作,但它仍然只比较指针。

std::less (as well as std::greater 等) 模板 do 对指针比较(通过特化)具有明确的含义。但他们仍然比较 指针 而不是它们指向的内容。

简单的解决方案? 不要使用指针!

在现代 C++ 中,除了多态性之外很少使用指针。指向字符串的指针更少(如果有的话)用于。例外可能是 C++11 中的智能指针,但我建议您根据 ownership 而不是自删除指针来查看它们。

如果我说 *p1 = "def";,那会改变 *p2 吗?如果 p1p2 这两个指针相等,则意味着它们引用相同的字符串 object。如果你改变那个单一的字符串对象,那么是的,*p2 也会改变。但是您已经调用了 new 两次。您有两个指向两个字符串对象的指针。改变一个不影响另一个。

std::equal<std::string*> 告诉你两个字符串指针是否相等,即指向同一个对象。 std::less<std::string*> 是一个有点随意的顺序:当且仅当你有两个不相等的字符串指针时,一个小于另一个。

(它是 "somewhat arbitrary" 因为对于指向单个字符串 array 的两个指针,顺序是明确定义的。指向具有最低索引的字符串的指针将更少比指向具有最高索引的字符串的指针)