是运营商< (小于)指针一致吗?

时间:2017-06-06 18:55:43

标签: c++ pointers

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

According to 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?

3 个答案:

答案 0 :(得分:4)

比较两个不相关的指针(即指向不指向同一个内存的指针,或者不指向同一个&#34;数组&#34;的不同部分)只能使用相等!=和不等式{{}来完成。 1}}。所有其他比较是未指定

如果你有两个指向同一个地方或同一个数组的指针,那么你可以使用相对运算符来比较它们。

所以如果你有例如。

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)

  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 :(得分:-1)

比较示例中显示的指针毫无意义,因为&#34; a&#34;和&#34; b&#34;值取决于数据如何存储在内存中,而不是存储在该位置的内容中。

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

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

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

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