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