Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ std::map::insert/operator[]混合用于将大多数有序值插入STL映射?_C++_Map_Stl - Fatal编程技术网

C++ std::map::insert/operator[]混合用于将大多数有序值插入STL映射?

C++ std::map::insert/operator[]混合用于将大多数有序值插入STL映射?,c++,map,stl,C++,Map,Stl,我需要合并和编辑多个文件,每个文件都由内存地址和相关内容组成,因此通常按内存地址排序(除非有人手动编辑它或其他内容),然后将结果(按顺序)写回单个S-Rec文件 为了方便地址的排序和处理,我决定使用一个映射,内存地址作为一个整数键,完整的SREC行(包括地址)作为一个字符串值,例如std::map mymap 由于文件可能有重叠区域,“合并”必须允许后续值覆盖任何现有值。由于std::insert不会替换现有的值,我的想法是使用操作符[],但有两件事引起了我的兴趣: std::insert还有一

我需要合并和编辑多个文件,每个文件都由内存地址和相关内容组成,因此通常按内存地址排序(除非有人手动编辑它或其他内容),然后将结果(按顺序)写回单个S-Rec文件

为了方便地址的排序和处理,我决定使用一个映射,内存地址作为一个整数键,完整的SREC行(包括地址)作为一个字符串值,例如
std::map mymap

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

  • std::insert
    还有一个表单,它接受一个
    迭代器位置
    的“提示”,并返回一个
    迭代器
    ,这似乎特别适合我将要进行的大多数顺序的插入类型-插入后的数据很可能按顺序跟随,所以为什么不给出最后一个位置作为提示呢(即,只需将上一个
    insert
    调用返回给下一个
    insert
    调用,并将其传递给迭代器即可)
  • 从“
    m[k]
    相当于
    (*((m.insert(value\u type(k,data\u type())))).first)).second
    ”,这让我想知道是否可以将提示表单和操作符(w/replacement)结合起来形式…毕竟,两者的复杂性都是对数的,除非为插入提供了一个好的提示,在这种情况下,它会变成一个“摊销常数”
  • 这一切归结为:通过在运算符[]语法中插入“hint”将insert与hint和运算符[]结合起来是否存在问题?例如,
    (*(m.insert(hint,value_type(k,data_type()))))。second=value;
    (这仍然会在分配新值之前使用默认构造函数创建一个值,这可能会以某种方式避免,但我现在不太担心字符串值…)


    奖励:是否有理由不将其写成
    (m.insert(提示,value_-type(k,data_-type())->second
    ,或者在原始示例中
    (*((m.insert(value_-type(k,data_-type()))。first))。second
    ?迭代器有什么特别之处吗



    (就其价值而言,“《插入》
    运算符[]
    之间的选择,其中的答案通常倾向于主张可读性,这是很好的,通常是良好的做法,但这个问题特别涉及有序(或大部分有序)数据,可能使某种程度的优化值得。)

    考虑到我所见过的大多数S-record文件的大小,以及您(大概)在混合使用I/O时所做的这一事实,如果其中任何一项真的有什么不同,我都会感到相当惊讶——I/O时间通常会占主导地位。关于使用提示和运算符[]的组合插入,您的意思是什么?创建您自己的运算符[]来接受提示(例如,从map派生)?或者仅仅使用您所采样的代码插入元素?关于奖励:我不认为有任何特殊原因,因为map强制了双向迭代器要求,这两种代码是等效的。在C++98中,运算符[]的定义与SGI文档中的定义相同,但在C++11中没有:“效果:如果地图中没有与
    x
    等价的键,则将
    value\u type(x,T())
    插入地图。”@Gonmator,我只是计划使用代码示例插入元素,而不是创建自己的操作符[]…@JerryCoffin,这正是我所期望听到的,但我仍然好奇这个结构是否有用。。。