注意:这个问题与总订单无关。可以使用
std::less
获得相同类型指针的全序。
根据this,如果两个指针指向不同的分配,则不允许将两个指针与
operator<
进行比较。
在哪种意义上是不允许的?是实现定义的、未指定的还是未定义的行为?
我想我在某处读到它没有具体说明。实现不需要记录行为是什么,但必须有一些行为。因此,这意味着比较任何两个指针仍然是合法的,但不一定会产生全序。 这是否意味着,在比较相同的两个指针两次时,我们仍然必须获得一致的结果?一般情况是:在应用程序中调用相同的未指定行为两次总是会产生相同的结果吗?
int i1, i2;
int* a = &i1;
int* b = &i2;
bool b1 = a < b; // unspecified, right?
bool b2 = a < b;
assert(b1 == b2); // Is this guaranteed to be true?
比较两个不相关的指针(即不指向同一内存的指针,或不指向同一“数组”的不同部分)只能使用相等
==
和不等式 !=
来完成。所有其他比较都是未指定。
如果有两个指针指向同一位置或同一数组内,则可以使用相对运算符来比较它们。
所以如果你有例如
int* p1 = new int[10];
int* p2 = new int[5];
您只能使用==
和
!=
来比较指针
p1
和
p2
。但是如果你有
int a = new int[10];
int* p1 = &a[0];
int* p2 = &a[3];
然后您还可以使用
<
和
>
(当然还有
<=
和
>=
)来比较
p1
和
p2
int a = 5,b = 6;
int *a_ptr = &a, *b_ptr = &b;
bool ans = a_ptr < b_ptr;//undefined behavior
示例2:
#include <iostream>
#include<vector>
#include<string>
#include<algorithm>
using namespace std;
int main()
{
std::string firstName = "Anoop",middleName = "Singh", lastName = "Rana";
std::vector<string *> storage_ptr = {&firstName,&middleName,&lastName};
std::vector<string *>::iterator begin = storage_ptr.begin();
while(begin!=storage_ptr.end()){
std::cout<<(**begin)<<std::endl;
begin++;
}
std::sort(storage_ptr.begin(),storage_ptr.end(),greater<string *>());
std::vector<string *>::iterator begin2 = storage_ptr.begin();
while(begin2!=storage_ptr.end()){
std::cout<<(**begin2)<<std::endl;
begin2++;
}
return 0;
}
如您所见,第一个 while
循环按降序打印向量,而第二个
while
循环按升序打印向量,这表明使用新标准 我们可以使用函数对象
greater<string *>
进行排序指针向量。
指针是内存中的地址(通常存储为 32 位整数)。除非您更改其中任何一个,否则它们的比较将返回相同的结果。你可能不知道结果是什么,但你会知道每次都是一样的。
因此,在您的情况下,b1 和 b2 都会得到相同的结果,因此断言将通过。
这是一个比较指针确实有意义的示例:
int data[1000];
int *end = data + 50;
for (int *c = data; c < end; c++)
... use *c