c++ - "inverse"关联容器?

标签 c++ stl std

在 STL 中或一般情况下是否存在一种“反向”关联容器? 例如,我想要一个容器,其中同一元素由一组键共享。

假设我的 key 是 int , 那么我会有例如:

container.at(3) -> some object A
container.at(4) -> same object A
container.at(1) -> other object B

对于不同的操作,此容器(理想情况下)具有与 std::map 相同的复杂性。这样的事情可能吗?

我一开始考虑使用 std::map<int, T*>其中几个索引指向同一个对象,但是当从 map 中删除一个项目时,运行时间在 O(n) 中,因为您必须检查其他项目以查看是否需要删除 T object

STL 或 boost 中是否已经“原生”存在这种容器?

编辑: 一些使用示例:

container<int, myClass> myContainer;
myClass obj(...); //new object
myContainer.insert(3, obj); //insert object for specific key
myContainer.insert(2, obj); //insert same object for specific key, since both objects would compare equal we would actually not "insert" a new object but have it shared by both keys
myContainer.duplicate_object(2,5); //key 5 also has the same object as key 2 (and 3)
myContainer.getAllKeys(2); //would return 2,3 and 5 since they all reference the same object as key 2
myContainer.removeKey(3);
myContainer.removeKey(2);
myContainer.removeKey(5); //would destroy the object here, not before

最佳答案

你可以使用一个

std::map<int,std::shared_ptr<myclass>>

在 C++11 中,它是标准的一部分。否则使用 Boost 库提供的共享指针。

共享指针的想法是它在内部保留一个引用计数,即它跟踪创建指针拷贝的次数。当您删除映射的条目时,共享指针对象的析构函数将确保计数器递减。一旦达到零,对象将被删除。


(编辑:)为了使答案更完整,一些用法示例:

#include <map>
#include <memory>

struct myclass
{

};


int main()
{
  std::map<int,std::shared_ptr<myclass>> mymap;

  /* std::make_shared() calls the constructor and creates a shared_ptr: */
  std::shared_ptr<myclass> object1 { std::make_shared<myclass>() };
  std::shared_ptr<myclass> object2 { std::make_shared<myclass>() };
  std::shared_ptr<myclass> object3 { std::make_shared<myclass>() };

  mymap[1] = object1;
  mymap[2] = object2;
  mymap[3] = object3;
  mymap[4] = object2;
  mymap[5] = object1;

  mymap.erase(2); // erases the (2,object2) entry
                  // therefore, decreases the counter
                  // for object2
                  // but (4,object2) is still intact

  return 0;
}

关于c++ - "inverse"关联容器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12486948/

相关文章:

c++ - 在 C++ 中重载运算符

c++ - 将用于类型检查的 if constexpr 中的 static_assert 转换为 C++14

c++ - gdb python pretty-print 打印 vector 单个元素的语法

c++ - 如何在调整大小的 std::vector 的最后一个元素之后插入?

c++ - 类定义中的 bad_alloc 错误

c++ - 在QT中点击按钮创建按钮

c++ - CreateDepthStencilView() 失败

c++ - std::map 使用 std::vector 初始化

c++ - 如何检查迭代器是否在没有容器的情况下结束?

c++ - std::string 的默认容量?