我有一个指针 void* p
指向一个未知类型的变量,以及一个容器std::set<MyClass*> c
填充了 MyClass
指针。有什么方法可以查明是否 c
包含 p
(即它是否包含指向与 p
相同的内存地址的指针)而无需手动循环遍历 c
中的元素,这不会导致未定义的行为? (请注意,如果我在 p
中找不到它,我不会取消引用 c
。)
此外,我假设转换 p
至 MyClass*
如果 p
会导致未定义的行为将指向一个不相关但与 MyClass
相关的数据类型的变量,但也许事实并非如此?
最佳答案
I assume that casting
p
toMyClass*
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_if
或 std::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/