关于指针类型的STL函数对象

我读到“库确保指针类型的较少(和其他函数对象)被很好地定义”。它来自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

回答:

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

std::less(以及std::greater等)模板有指针的比较(通过特化)以及指定的含义。但他们仍然比较指针而不是他们指向。

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

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

回答:

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

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

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

以上是 关于指针类型的STL函数对象 的全部内容, 来源链接: utcz.com/qa/261529.html

回到顶部