std :: map :: insert / operator [] hybrid用于将大部分有序值插入到STL映射中?

时间:2013-06-19 14:44:27

标签: c++ map stl

我需要合并和编辑多个Motorolla S-Record (MOT/SREC)文件,每个文件由内存地址和相关内容组成,因此通常按内存地址排序(除非有人手工编辑它或其他东西),然后写结果(按顺序)退回到单个S-Rec文件。

为了便于订购和处理地址,我决定使用一个映射,其中存储器地址作为整数密钥,而完整的SREC行(包括地址)作为字符串值,例如, std::map<int,std::string> mymap;

由于文件可能具有重叠区域,因此“合并”必须允许后续值覆盖任何现有值。由于std::insert不会替换现有值,我的想法是使用operator[],但是有两件事引起了我的兴趣:

  1. std::insert还有一个带有iterator position'提示'并返回iterator的表单,这似乎特别适合我将要执行的大多数有序插入的类型 - 插入后的数据非常可能按顺序跟随它,所以为什么不将最后一个位置作为提示(即只是将迭代器传递给下一个insert调用返回{ {1}}致电)?
  2. SGI STL reference开始,“insert相当于m[k]”,这让我想知道我是否可以将提示形式与运营商(w /替换)形式相结合......毕竟,除非为插入物提供了良好的提示,否则两者的复杂性都是对数的,在这种情况下它会成为“摊销常数”...
  3. 所有归结为:通过在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)).secondinsert之间的选项,并且那里的答案往往会争论一般的可读性,这很好,并且是一般的良好做法,但这个问题特别涉及有序(或大部分有序)的数据,可能会使某些优化水平值得。)

0 个答案:

没有答案