我需要合并和编辑多个Motorolla S-Record (MOT/SREC)文件,每个文件都包含内存地址和相关内容,因此通常按内存地址排序(除非有人手动编辑它或其他东西),然后将结果写回(按顺序)到单个 S-Rec 文件。
为了便于对地址进行排序和处理,我决定使用内存地址作为整数键和完整 SREC 行(包括地址)作为字符串值的映射,例如std::map<int,std::string> mymap;
由于文件可能具有重叠区域,因此“合并”必须允许后续值覆盖任何现有值。由于std::insert
不会替换现有值,我的想法是使用operator[]
,但有两件事引起了我的兴趣:
std::insert
还有一个表单,它接受一个iterator position
“提示”并返回一个iterator
,这似乎特别适合我将要做的大多数有序插入的类型 - 插入后面的数据很可能按顺序跟随它,所以为什么不给最后一个位置作为提示(即只是将最后一个insert
调用传递给下一个insert
调用的迭代器)?- 从SGI STL 参考资料中,“
m[k]
相当于(*((m.insert(value_type(k, data_type()))).first)).second
”,这让我想知道我是否可以将提示形式和运算符(w/replacement)形式结合起来......毕竟,除非提供了好的提示,否则两者的复杂性都是对数的插入,在这种情况下,它成为“摊销常数”......
这一切都归结为:通过在 operator[] 语法中插入“提示”来组合 insert-with-hint 和 operator[] 是否存在问题?例如(*(m.insert(hint, value_type(k, data_type())))).second = value;
(这仍然会在分配新值之前使用默认构造函数创建一个值,这可能会以某种方式避免,但我现在不太担心字符串值......)
奖励:有没有理由不写成(m.insert(hint, value_type(k, data_type())))->second
,或在原始示例中(*((m.insert(value_type(k, data_type()))).first)).second
?迭代器有什么特别之处吗?
(对于它的价值,“在 STL 映射中,使用 map::insert 比使用 [] 更好吗? ”处理 and 之间的选择, 并且那里的答案通常倾向于为可读性而争论,这很好,也是一种很好的做法一般来说,但这个问题特别涉及有序(或大部分有序)数据,这可能会使某种程度的优化值得。)insert
operator[]