2016-12-16 69 views
10

C++標準定義了使用std::map構造一個std::initializer_list的std ::地圖初始化列表構造

map(std::initializer_list<value_type> init, const Allocator&); 

但是,如果被定義,如果初始化列表中包含重複鍵時會發生什麼?是第一個關鍵選擇,還是最後一個?例如:

std::map<std::string, int> my_map { 
    {"a", 1}, 
    {"a", 2} 
}; 

在實踐中,似乎它像insert(),使地圖現在將包含{A:1}。

但是,我無法在C++標準中找到任何關於此的內容。

回答

5

N4296(〜C++ 14)

表102 - 聯想容器要求

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

然後從上面的表中,對於迭代器構造函數:

效果:構造一個空的容器 並插入從範圍[i, j)元件 進去; 使用c作爲比較對象。

ij滿足輸入的迭代器要求,並且是指元件隱式轉換爲value_type[i,j)表示的有效範圍,

注意,「和插入元件」在這裏是不是標記爲表示insert函數,但我想我們可以這樣解釋它。另外請注意,ij都是輸入迭代器,所以必須按順序遍歷。

(它是稍硬找到此信息,因爲等效表中的所有具有

il指定類型initializer_list<value_type>

它們上方的一個對象,所以可以通過搜索initializer_list找到,但是對於這張表,這個詞被分成兩行,在中斷處有一個連字符。)

+3

技術上,至少從引用的部分來看,標準似乎並不指示在哪個元素將被插入。 – user2079303

+0

@ user2079303更好? – BoBTFish

+2

我不確定這是否足夠。當然,當傳入的迭代器只是一個輸入迭代器時,它們必須按順序插入,但initializer_list的迭代器是一個隨機訪問迭代器,我沒有看到禁止不同類型迭代器專用化的規則。 – user2079303