关于指针类型的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
?如果两个指针p1
和p2
相等,则意味着它们指的是相同的字符串对象。如果你改变那个单一的字符串对象,那么是的,*p2
也会改变。但是你已经拨了两次new
。你有两个指向两个字符串对象的指针。改变一个不会影响另一个。
std::equal<std::string*>
告诉你两个字符串指针是否相等,即指向同一个对象。 std::less<std::string*>
是有点任意的顺序:当且仅当你有两个不相等的字符串指针时,一个比另一个小。
(这是“有点任意的”,因为顺序定义为两个指针合并为一个字符串数组。索引最小的字符串的指针将小于指向最高索引字符串的指针)
以上是 关于指针类型的STL函数对象 的全部内容, 来源链接: utcz.com/qa/261529.html