是操作员< (less than) on pointers consistent?

问题描述 投票:0回答:3

注意:这个问题与总订单无关。可以使用

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?
c++ pointers
3个回答
8
投票

比较两个不相关的指针(即不指向同一内存的指针,或不指向同一“数组”的不同部分)只能使用相等

==
和不等式
!=
来完成。所有其他比较都是未指定

如果有两个指针指向同一位置或同一数组内,则可以使用相对运算符来比较它们。

所以如果你有例如

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

    


1
投票
    不可能比较两个
  1. 不相关的指针(除了使用 == 和 !=),即比较两个不相关的指针是未定义的。
  2. 但是,仍然可以创建一个指针向量,然后根据这些指针的地址对该向量进行排序!请参阅下面的示例 2。
示例1:

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 *>
 进行排序指针向量。


-2
投票
比较示例中所示的指针没有什么意义,因为“a”和“b”值取决于数据如何存储在内存中,而不取决于存储在该位置的内容。

指针是内存中的地址(通常存储为 32 位整数)。除非您更改其中任何一个,否则它们的比较将返回相同的结果。你可能不知道结果是什么,但你会知道每次都是一样的。

因此,在您的情况下,b1 和 b2 都会得到相同的结果,因此断言将通过。

这是一个比较指针确实有意义的示例:

int data[1000]; int *end = data + 50; for (int *c = data; c < end; c++) ... use *c
    
© www.soinside.com 2019 - 2024. All rights reserved.