指针上的运算符<(小于)是否一致?
Is operator< (less than) on pointers consistent?
注意:这个问题与总顺序无关。可以使用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];
您只能使用==
和!=
比较指针p1
和p2
。
,但是如果您有
int a = new int[10];
int* p1 = &a[0];
int* p2 = &a[3];
然后,您还可以使用<
和>
(当然还有<=
和>=
(来比较p1
和p2
- 不可能比较两个无关的指针(除了==和!=(,这比较了两个不相关的指针。
- 但是,仍然可以创建一个指针向量,然后根据这些指针的地址对矢量进行排序!请参阅下面的示例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
- 在提升multi_index容器中,是否定义了"default index"?
- 在C++STL中是否有Polyval(Matlab函数)等价物?
- 检查输入是否不是整数或数字
- 是否可以初始化不可复制类型的成员变量(或基类)
- 如何检查两个 std::向量在小于 O(n) 的时间复杂度内是否相等
- 指针上的运算符<(小于)是否一致?
- 验证字符是否小于字母 c++ 中的指定字母
- STL 是否有办法在调用小于之前应用函数
- 如何检查 stdin 中的数字是否小于给定类型的数字限制
- 检查前提条件是否存在原子增量,即原子值小于指定值
- 对于正值,int(doubleValue)是否保证小于或等于doubleValue
- 比较具有替代排序的自定义类型的std::元组(或std::对).是否可以插入自定义的小于/比较函数
- 堆栈上的所有值是否都小于传递的值
- std::string find是否要求pos小于字符串大小
- 确定序列中x个数的和是否小于y
- 在溢出的情况下,i++是否对小于int的有符号类型调用未定义的行为?
- 是否有一种方法可以正确地比较一个float值是否大于/小于另一个
- 在小于0 (N)的时间内找出点是否在N个(可能重叠)矩形中的一个内
- 大小小于int的位域是否应该进行整型提升?
- 创建一个函数,检查一个数组是否有两个相反的元素,复杂度小于n^2.(c++)