std :: multiset <int>与std :: map <int,std :: size_t>保持多个可重复的整数值

pen*_*ope 7 c++ containers stl

我想创建一个记录来保存有关的信息

  • a)存在什么样的元素和
  • b)存在的各种元素的数量

在树的节点中.我会明确地仅存储叶节点信息,而父节点中的信息可以通过结合这一切的信息获取的孩子(如儿童1具有的3个对象,B的1个对象,儿童2有1 A对象,C对象的2个对象有4个A对象,1个B对象和2个C对象.

从父节点请求此信息时,我会小心不要首先请求,使用和丢弃子节点的信息,然后是其父节点,但向上构造将是一个常见的操作.其他两个常见的操作直接来自我存储的内容:是X类的对象存在吗?以及有多少种X物品存在?还有多少种物品?

对象种类表示为整数,对象编号始终为整数值.什么是更好的选择(以及所选选项的参数):

  • 使用std::multiset<int>,操作std::multiset::count()std::multiset::find()操作(更容易结合但元素重复,难以获得完全不同的元素数)
  • 使用std::map<int, std::size_t>种类作为键和对象数量作为值(没有重复的元素,std::map::find()存在的函数,大小给出了存储的正确数量的对象种类,但访问不存在的元素会无意中增加大小)

谢谢你的建议!

Fre*_*Foo 9

要根据比较谓词存储总共n个具有k个不同值的项目,则std::multiset分配n个二叉搜索树节点(*).一个std::map仅分配ķ(稍大)节点.

std::multiset可以使用比较谓词可以认为两个项目相等但仍必须显式存储,因为它们在比较谓词不检查的某些方面有所不同.此外,迭代a multiset生成n个项中的map每一个,而a 将生成具有每个项的计数的k个不同项中的每一个.

在项目只是整数的情况下,请使用std::map.您的"多少个不同的项目"查询将只是一个调用size,它在恒定的时间内运行.

您声称"访问不存在的元素会无意中增加大小"仅在您用于operator[]访问节点时才会出现.find没有表现出这种行为.

(*)C++标准并不保证这些容器是作为(平衡的)BST实现的,但在我见过的所有实现中,它们都是.