std :: map初始化列表构造函数

tob*_*spr 11 c++ standards language-lawyer c++11

C++标准std::map使用以下命令定义构造函数std::initializer_list:

map( std::initializer_list<value_type> init, const Allocator& );
Run Code Online (Sandbox Code Playgroud)

但是,在哪里定义了初始化程序列表包含重复键时会发生什么?是第一个选择键还是最后一个?例如:

std::map<std::string, int> my_map {
  {"a", 1}, 
  {"a", 2}
};
Run Code Online (Sandbox Code Playgroud)

在实践中,它似乎表现得像insert(),因此地图现在将包含{a:1}.

但是,我无法在C++标准中找到任何关于此的内容.

BoB*_*ish 5

N4296(~C++ 14)

表102 - 关联容器要求

X(il); | 与...相同X(il.begin(), il.end()).

然后从表中的上方,对于迭代器ctor:

效果:构造一个空容器并将范围中的元素[i, j)插入其中; 使用c作为比较对象.

ij满足输入迭代器的要求,并引用可隐式转换为的元素value_type,[i,j)表示有效范围,

请注意,此处的"和插入元素" 标记为表示insert功能,但我想我们可以这样解释它.另请注意,i并且j输入迭代器,因此必须按顺序遍历.

.

(找到这些信息稍微困难一些,因为相同的表格都有

il 指定类型的对象 initializer_list<value_type>

在它们之上,所以可以通过搜索找到initializer_list,但对于这个表,这个单词被分成两行,在断点处有一个连字符.)

  • 从技术上讲,至少从引用的部分来看,标准似乎没有规定插入元素的顺序. (3认同)
  • 我不确定这是否足够.当然,当传递的迭代器只是一个输入迭代器时,它们必须按顺序插入,但是initializer_list的迭代器是一个随机访问迭代器,我没有看到禁止不同类型迭代器的特化的规则. (2认同)