我读到“库保证指针类型的较少(和其他函数对象)被很好地定义”。它来自C ++ Primer第5版。例如:
x
但是当我尝试这个时:
vector <string *> nameTable;
sort(nameTable.begin(), nameTable.end(), less<string *>());
返回0表示false。为什么呢?
编辑:抱歉,我读了并理解了这本书的错误。它说:
string *p1 = new string("abc");
string *p2 = new string("abc");
cout << equal_to<string *>()(p1, p2);
答案 0 :(得分:5)
您的比较将比较指针而不是它们指向的字符串。使用<
或>
比较指针被指定为特定于实现的。使用==
和!=
是指针上唯一明确定义的操作,但它仍然只比较指针。
std::less
(以及std::greater
等)模板做具有明确的意义,用于比较指针(通过特化)。但他们仍然比较指针而不是他们所指向的。
简单的解决方案? 不要 使用指针!
在现代C ++中,除了多态之外,很少使用指针。指向字符串的指针甚至更少(如果有)用于。例外情况可能是来自C ++ 11的智能指针,但我建议您根据所有权而不是自行删除指针来查看它们。
答案 1 :(得分:1)
如果我说*p1 = "def";
,那会改变*p2
吗?如果两个指针p1
和p2
相等,则表示它们引用相同的字符串 object 。如果你改变那个单个字符串对象,那么是的,*p2
也会改变。但是你已经两次致电new
。你有两个指向两个字符串对象的指针。改变一个不会影响另一个。
std::equal<std::string*>
告诉您两个字符串指针是否相等,即引用同一个对象。 std::less<std::string*>
是一个有点随意的顺序:当且仅当你有两个不相等的字符串指针时,一个小于另一个。
(它有点“随意”,因为顺序是两个指针定义为单个字符串 array 。指向索引最低的字符串的指针将小于指向字符串的指针具有最高指数)