注意:此问题与总订单无关。可以使用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?
答案 0 :(得分:4)
比较两个不相关的指针(即指向不指向同一个内存的指针,或者不指向同一个&#34;数组&#34;的不同部分)只能使用相等!=
和不等式{{}来完成。 1}}。所有其他比较是未指定。
如果你有两个指向同一个地方或同一个数组的指针,那么你可以使用相对运算符来比较它们。
所以如果你有例如。
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 :(得分: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