为了提出我的问题,假设我有一组指针(相同类型)
{p1, p2, ..., pn}
我想将它们存储在多个容器中,因为我需要不同的访问策略来访问它们。假设我想将它们存储在两个容器中,链表和哈希表。对于链表,我有顺序,对于哈希表,我有快速访问。现在,问题是如果我从一个容器中删除一个指针,我需要记住从另一个容器中删除。这使得代码难以维护。所以问题是还有其他模式或数据结构来管理这样的情况吗?智能指针在这里有帮助吗?
为了提出我的问题,假设我有一组指针(相同类型)
{p1, p2, ..., pn}
我想将它们存储在多个容器中,因为我需要不同的访问策略来访问它们。假设我想将它们存储在两个容器中,链表和哈希表。对于链表,我有顺序,对于哈希表,我有快速访问。现在,问题是如果我从一个容器中删除一个指针,我需要记住从另一个容器中删除。这使得代码难以维护。所以问题是还有其他模式或数据结构来管理这样的情况吗?智能指针在这里有帮助吗?
如果我理解正确,您想链接您的容器,以便从一个容器中删除所有容器。我不认为这是直接可能的。可能的解决方案:
std::weak_ptr
,以便您可以检查项目是否已在其他地方删除,并std::shared_ptr
在使用时将其转到(您需要一个容器具有“主”std::shared_ptr
以在不使用时保留对象)你为什么不创建你自己的类,它包含两个std::list
和std::unordred_map
并提供访问函数并提供删除函数,你可以使用线性list
和随机访问它们unordred_map
,删除将从容器中删除,插入将插入两者。(一种包装类:P)
您还可以考虑使用std::map
,并为其提供比较功能,该功能将始终以所需的方式保持数据结构有序,并且您可以随机访问具有log N
访问时间的元素。
通常,尝试隔离此逻辑以使事情更易于支持。一些具有安全公共接口的小类(对不起,我没有编译这个,它只是一个伪代码)。
template<class Id, Ptr>
class Store
{
public:
void add(Id id, Ptr ptr)
{
m_ptrs.insert(ptr);
m_ptrById.insert(std::make_pair(id, ptr));
}
void remove(Ptr ptr)
{
// remove in sync as well
}
private:
std::list<Ptr> m_ptrs;
std::map<Id, Ptr> m_ptrById;
};
然后使用 Store 保持指针同步。
如果我正确理解您的问题,那么您对内存管理(新/删除问题)的关注较少,而对哪个元素有效与否的实际“簿记”更加关注。
所以,我正在考虑用“参考计数器”包装每个点
template< class Point >
class BookKeeping {
public:
enum { LIST_REF = 0x01,
HASH_REF = 0x02 };
BookKeeping( const Point& p ): m_p(p), m_refCout( 0x3 ) {} // assume object created in both containers
bool isValid() const { return m_refCount == 0x3; } // not "freed" from any container
void remove( unsigned int from ) { m_refCount = m_refCount & ! from ; }
private:
Point m_p;
unsigned int m_refCount;
};
请参阅此类似问题的答案(目前为止唯一的答案)。在这种情况下deque
,建议使用 a 而不是 a list
,因为 OP 只想在序列的末尾插入/删除。
无论如何,您可能更喜欢使用Boost Multi-index Containers Library。