c++ - 在 MyClass 指针的容器中找到一个 void 指针?

标签 c++ casting undefined-behavior void-pointers

我有一个指针 void* p指向一个未知类型的变量,以及一个容器std::set<MyClass*> c填充了 MyClass指针。有什么方法可以查明是否 c包含 p (即它是否包含指向与 p 相同的内存地址的指针)而无需手动循环遍历 c 中的元素,这不会导致未定义的行为? (请注意,如果我在 p 中找不到它,我不会取消引用 c。)

此外,我假设转换 pMyClass*如果 p 会导致未定义的行为将指向一个不相关但与 MyClass 相关的数据类型的变量,但也许事实并非如此?

最佳答案

I assume that casting p to MyClass* would cause undefined behavior if [..]

它可能会导致 UB,这在学究气上是正确的。

但应该可以在实践中使用(UB 的乐趣)。

Is there some way to find out whether c contains p [..] without manually looping through the elements in c.

std::find_ifstd::binary_search可以与适当的谓词一起使用以在线性时间内找到它(std::set::iterator 不是随机迭代器,因此“伪造”binary_search 复杂性)。

如果您可以将容器更改为:

  • std::set<MyClass*, std::less<void>> , 那么你可以安全地使用 std::set::find 感谢透明比较器。

  • 已排序 std::vector<MyClass*> , 那么你可以使用 std::binary_search具有正确的复杂性。

关于c++ - 在 MyClass 指针的容器中找到一个 void 指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54054737/

相关文章:

c# - 这是在C#.NET a+++++ a中完美定义的吗?如果是,那么为什么我得到奇怪的输出?

c++ - 模板中关于引用折叠的右值(&&) 左值(&) 引用绑定(bind)的规则是什么?

Swift:如何将 Optional ("Optional(str)") 转换为 Int

c# - 为什么从 byte 到 sbyte 的转换会为优化代码提供错误的值?

c++ - “is not required” ==未定义行为?

c++ - 派生类没有额外的数据成员;将基对象静态向下转换为派生对象是否安全?

c++ - 如何检查字符串中字母的出现情况?

c++ - 从二进制文件中读取6字节8位整数

c++ - 将数字存储在未知大小的数组中(并计算一些值)

java - 从 Void 转换,将任何类型存储在 Map 中