【发布时间】:2014-04-02 03:36:30
【问题描述】:
我正在解决一个非常具体的问题,它需要使用数据结构来存储和跟踪对象。举个简单的例子,假设我有以下 2 个类:
class Foo
{
Foo Foo(bool isRed) {m_bRed = isRed} ;
bool m_bRed;
}
class Bar
{
Bar Bar(Foo* pFoo) {m_pFoo = pFoo} ;
Foo * m_pFoo;
}
在程序运行时,将创建许多 Foo 和 Bars,并且在程序终止时,我想知道有多少 Bars 是红色的(因为它包含 Foo)。请假设这两个类都没有 getter/setter,解决这个问题的唯一方法是挂钩 Foo 和 Bar 的构造函数。现在,最好的数据结构是什么?
我认为一个潜在的解决方案是使用以下格式的两个(无序)地图:
std::map<Foo*, bool> g_FooContainers;
std::map<Bar*, bool> g_BarContainers;
当 Foo 被创建时,我们将它插入到它的映射中,
g_FooContainers.insert(std::make_pair(Foo*, isRed));
当 Bar 被创建时,我们在它的 map 中查找传入的 Foo*,如果找到,将 Bar 插入到它的 map 中,并带有对应的 isRed。
r = g_FooContainers.find(Foo*);
if (r != unordered_map::end)
{
g_BarContainers.insert(std::make_pair(Bar*, r->second)));
}
并且在程序执行结束时,我们可以循环遍历 g_BooContainers 看看哪个 Bar 是红色的。
现在,我想知道是否有更有效的方法来做到这一点?也许只有一个 std::map?
请告诉我。
【问题讨论】:
-
添加 getter 和 setter 似乎是一个更好的解决方案,因为您已经有了一个集合。您似乎只是在复制集合以存储更多数据。如果它们不同步,上帝会帮助你......另一种方法取决于你的需要:只需保留一个 int 的 redFooCount 并在创建时递增,在销毁时递减。
标签: c++ data-structures map