gpt4 book ai didi

c++ - 在 C++ 中是否有可移植的指针关系比较的替代方法?

转载 作者:行者123 更新时间:2023-11-30 00:59:22 24 4
gpt4 key购买 nike

我缺乏这门语言的行业经验。但是在业余时间,我遇到了几个需要比较指针的地方,最好是与标准定义的行为进行比较。

第一种情况,如果我决定在我的应用程序中使用有序二叉树作为容器(而不是哈希表),并且我希望对象的身份是相等的(即相等意味着相同的实例),那么我找不到可移植的方法来这样做。

其次,如果我想测试“完整对象”及其子对象之间的包含关系,我又似乎没有可移植的方法。也就是说,如果我有两个 void* 指针“p”和“q”,并且我有“q”指向的对象的大小,我看不出有什么办法可以测试“p”是否是“q”与否。我没有在标准的第 5.9 段(“关系运算符”)中找到鼓励。后一种情况出现,例如,来自这个 boost 论坛的垃圾收集器 post .我喜欢这个总体想法并开始探索它,但某些部分似乎以不可移植的方式使用指针和分配语义。

那是我想知道如何制作 contains来自以下代码的函数可移植:

#include <stddef.h>
#include <assert.h>

struct A {
int x;
} a;

struct B {
int y;
} b;

bool contains(const void *outer, size_t size, const void *inner)
{
return (outer <= inner) &&
(inner < static_cast<const char *>(outer) + size);
}

int main()
{
assert(contains(&a, sizeof(a), &a.x));
assert(contains(&b, sizeof(b), &b.y));
assert(!contains(&a, sizeof(a), &b.y));
assert(!contains(&b, sizeof(b), &a.x));
}

谢谢并致以最诚挚的问候。

附言:
好的,在再次查阅标准之后,我看到它明确指出,正如 GMan 在他的回答中所告知的那样,仿函数如 lessless_equal为指针提供总排序。我认为这也暗示排序将与内置比较运算符一致 <<= ,但这一点可以更迂腐地解决。当指针不指向同一数组或同一对象的子对象时,内置运算符是不可预测的。我的意思是,在这个总顺序中,什么是独特性测试 - 指针的二进制表示?例如,当无法以明确定义的方式与内置运算符进行比较时,在 void* 上的总顺序中不相同意味着什么?指针?

对于具有相同访问控制的成员变量,标准定义了它们在内存中的顺序,即当通过指针比较观察时。它是对象类型定义中出现的顺序。从内置的比较运算符来看,第一个成员变量的地址最小,最后一个成员变量的地址最大。此外,在关于类型的部分中,声明“平凡可复制类型”的对象将在 & 的值之间的范围内布置在内存中。运算符和以下 sizeof人物。现在让我们假设仿函数在指向不同对象的指针意义上提供了完全有序。这是否意味着,如果在 contains 中使用仿函数而不是内置运算符,即使无意中,标准也暗示了上面代码片段的行为。功能?

只是想弄清楚这一点——如果标准有遗漏,或者只是需要澄清,或者它为指针比较的实现留下了灵 active 。

最佳答案

我不太确定您的要求是什么(即,您到底想要完成什么?),但我认为这就是您想要知道的:

关系仿函数 greater , greater_equal , less , 和 less_equal<functional> 中定义产生任何指针类型的总排序,即使内置关系运算符不这样做也是如此。

即:

#include <functional>
#include <iostream>

int main()
{
int i, *j = &i;
int k, *l = &k;

std::cout << std::boolalpha << std::less<int*>()(j, l) << std::endl;
}

定义明确。 (请注意,输出是实现定义的,但您保证总排序。)

关联容器谓词默认为 std::less , 因此可以使用指针作为键。

关于c++ - 在 C++ 中是否有可移植的指针关系比较的替代方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4533258/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com