假设我有以下内容:
struct MetadataThingy {
void *actual_thingy;
int some_metadata;
int more_metadata;
bool operator<(MetadataThingy const& other) const {
return actual_thingy < other.actual_thingy;
}
};
whereactual_thingy
指向一些重要的数据,我希望容器按 的值actual_thingy
而不是指向的元素的值排序,但是我需要存储一些关于它的其他数据,所以我创建了MetadataThingy
带有比较器的包装类,它只考虑指针的值actual_thingy
(而不是使用 的容器void *
)
现在,给定以下代码:
std::set<MetadataThingy> thingy_set;
void test() {
MetadataThingy m1 { nullptr, 5, 20 };
MetadataThingy m2 { &m1, 1, 2 };
MetadataThingy m3 { &m2, 6, 0 };
thingy_set.insert(m1);
thingy_set.insert(m2);
thingy_set.insert(m3);
MetadataThingy m;
m = *thingy_set.find(m2); // OK.
m = *thingy_set.find(static_cast<void *>(&m2)); // Nope. Can't use a pointer.
}
由于每个MetadataThingy
对象都可以由它存储的指针值唯一标识并按指针值排序,因此只需使用 avoid *
作为键来查找/删除对象是有意义的。但是,就目前的情况而言,MetadataThingy
每次搜索元素时我都必须创建一个虚拟对象,这感觉非常笨拙。我已经考虑过只使用map
带有指针的键和MetadataThingy
值,但由于每个指针都MetadataThingy
必须包含指针,这感觉有点多余。那么,有没有办法使用集合中存储的元素以外的类型的元素来查找或删除集合中的值,假设这两种类型的元素是相互可比的,并且一种类型的元素可以唯一地映射到另一个(void *
和MetadataThingy
是同构的)?(我没有在上面的代码中包含任何内容,但假设存在用于比较void *
和MetadataThingy
任何顺序的运算符重载。)
关于我要解决的问题的一些背景知识,以防万一有人可以推荐更好的方法:我需要按多个标准订购一个集合,所以我有几个MetadataThingy
容器,所有容器都按不同的标准排序。在这种情况下,“元数据”是我需要跟踪所有容器中元素位置的东西,以便我可以快速删除。这听起来像是提升多索引容器的完美工作,但这些元素的顺序不断变化,这意味着 AFAIK 将意味着它不会工作。