2017-06-19 70 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*>是有点任意的顺序:当且仅当你有两个不相等的字符串指针时,一个比另一个小。

(这是“有点任意的”,因为顺序定义为两个指针合并为一个字符串数组。索引最小的字符串的指针将小于指向最高索引字符串的指针)