【发布时间】:2012-05-30 09:40:57
【问题描述】:
我想创建一个记录来保存关于
的信息- a) 存在什么样的元素和
- b) 存在的每种元素的数量
在树的一个节点中。我将只为叶节点显式存储此信息,而父节点的信息可以通过组合所有子节点的信息来获得(例如,孩子 1 有 3 个 A 对象,1 个 B 对象,孩子 2 有 1 A 的对象,C 的 2 个对象 -- parent 有 A 的 4 个对象,B 的 1 个对象和 C 的 2 个对象。
在向父节点请求此信息时,我会小心,不要先请求、使用和丢弃子节点的信息,然后再请求其父节点,但向上构造将是常见的手术。其他两个常见的操作直接来自我存储的内容:X 种类的对象是否存在?和X 种类的对象有多少?以及如何存在多种对象?
对象种类以整数表示,对象编号始终为整数值。什么是更好的选择(以及所选选择的论据):
- 使用
std::multiset<int>,并使用std::multiset::count()和std::multiset::find()操作(更容易合并但元素重复,难以获得不同元素的总数) - 使用
std::map<int, std::size_t>,类型作为键,对象数量作为值(没有重复的元素,std::map::find()函数存在,大小给出了存储的对象类型的正确数量,但访问不存在的元素会增加尺寸无意)
感谢您的建议!
【问题讨论】:
-
@larsmns 我无法在工作环境中测试它们(我正在实施一件大事,这个组件将用于尚未实施的事情,也许还没有计划中的事情) .而且,我无法预测操作的确切比例,因此我无法模拟工作环境。谢谢你的
size_t。 -
@larsmans 虽然我不是“总是不加推理地配置文件”的大朋友——参数,+1 用于传播无符号类型。有符号类型比无符号类型更有意义的情况通常要少得多。
-
@ChristianRau:你说的很对,很抱歉。我仔细考虑了这个问题并发布了答案;
map和multiset实际上可以具有不同的空间复杂度,具体取决于键的分布。
标签: c++ stl containers