指针上的运算符<(小于)是否一致?

Is operator< (less than) on pointers consistent?

本文关键字:小于 是否 运算符 lt 指针      更新时间:2023-10-16

注意:这个问题与总顺序无关。可以使用std::less获得相同类型指针的总订单。

据此,如果将两个指针与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];

您只能使用==!=比较指针p1p2

,但是如果您有

int a = new int[10];
int* p1 = &a[0];
int* p2 = &a[3];

然后,您还可以使用<>(当然还有<=>=(来比较p1p2

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

比较示例中所示的指针毫无意义,因为" a"answers" b"值取决于如何存储在内存中的数据,而不是在该位置存储的内容上。

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

因此,在您的情况下,您将获得B1和B2的相同结果,因此主张将通过。

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

int data[1000];
int *end = data + 50;
for (int *c = data; c < end; c++)
     ... use *c