C++ boost::multi_索引来自同一对象的多个键
假设我有一个对象,可以通过来自不同名称空间的不同名称来识别:C++ boost::multi_索引来自同一对象的多个键,c++,boost,C++,Boost,假设我有一个对象,可以通过来自不同名称空间的不同名称来识别: enum Namespace { nspaceA, nspaceB }; struct Object { int id; std::map<Namespace, std::string> names; }; 所以候选者是一个复合键,据我所知,一个对象只能代表一个键。但是一个对象实例的名称在不同的名称空间中。有没有办法用boost::multi_indexarray解决这个问题?您可以在容
enum Namespace {
nspaceA,
nspaceB
};
struct Object {
int id;
std::map<Namespace, std::string> names;
};
所以候选者是一个复合键,据我所知,一个对象只能代表一个键。但是一个
对象
实例的名称在不同的名称空间中。有没有办法用boost::multi_index
array解决这个问题?您可以在容器中存储多个对象,其中每个对象都引用要存储的原始对象
例如,如果您有一个Foo类型的对象,它可以被几个不同的键引用,其中每个键都是一个名称空间+名称对,那么您就可以实例存储Foo类型的对象
struct Key {
Namespace namespace;
std::string name;
std::shared_ptr<Foo> object;
};
struct键{
名称空间;
std::字符串名;
std::共享的ptr对象;
};
而不是直接存储Foo对象
更新(问题更新后):
如果需要以其他方式(如通过id)查找对象,则需要使索引非唯一或将对象存储在辅助容器中
另一种选择是在容器上将名称空间分隔为不同的索引,当然这也不适用于所有情况。考虑到
名称空间
只有两个值,您是否最好这样定义对象
struct Object {
int id;
std::string nameA,nameB; // potentially empty
};
在这种情况下,
对象
可以通过id
,nameA
和nameB
轻松索引这是显而易见的,存储指向同一对象的多个指针,但我不能使用其他键,如unique id,让我修改questionNo,这是真的,但是您可以将对象本身存储在其他位置。然后我需要手动保持两个容器的同步,这是我想要避免的,这就是为什么我尝试使用boost::multi_index
。因此,恐怕这不是一个解决方案,我可能会误解,但在我看来,如果您对id字段使用非唯一索引,您将不需要手动保持同步?非唯一索引一方面会中断数据验证,另一方面我必须在插入时手动添加多个索引。它给我的唯一好处是一次删除数据。我担心失去拥有唯一指数的能力,代价太大了。但是,让我们把它算作一个局部解决方案。它们可能是整个名称空间中名称之间的冲突吗?那么nspaceA
上的“foobar”是否可以引用与nspaceB
上的“foobar”不同的对象?如果没有,那么您可以使用boost::multi_index
来实现这一点,但如果是这样的话……可能不会,但我不能保证这一点,我更愿意维护单独的容器,而不是依赖它。@Chad同一个对象在不同的名称空间中肯定有相同的名称,所以我想这无论如何都会破坏它。这不是真正的代码,而是最小的示例。奇怪的是,你从中推断出需求。换句话说,如果名称
映射中不同键的数目N很小(假设并使用开关按名称空间/名称组合查找对象?顺便说一句,要创建N个索引,我不必将映射
转换为数据成员。不是开关
,而是对所有索引进行线性扫描。是的,不需要删除映射
即可完成此操作。正如我在问题中所说的,我需要按名称空间/名称c查找对象。)ombination(有一个例子)。如果没有开关和线性扫描,我怎么做呢?
struct Object {
int id;
std::string nameA,nameB; // potentially empty
};