簡體   English   中英

地圖和集合請解釋為什么這個代碼有 output

[英]Maps and sets please explain why this code has the output

地圖和集合請解釋為什么這段代碼有 output 我特別困惑什么 m[x] ++ 和輸出 3:0 我的理解是集合是 (0,1,2,2,4,4)和米。 insert(key,value) 會記錄 map (0,2,4,4,8,8) 這將使 output 0:0 1:2 2:4 3:4 4:8 請告訴我為什么這是不正確的.

set < int > s ;
map < int , int > m ;
s.insert (0);
s.insert (4);
s.insert (2);
s.insert (4);
s.insert (1);
s.insert (2);
for ( int x : s ) {
    if ( m.count ( x ) == 0) {
        m.insert ({ x , x * 2});
    } else {
        m [ x ]++;
    }
}
for ( int i = 0; i < 5; i ++) {
    cout << i << ": " << m [ i ] << endl ;
}  

實際 output:

0: 0
1:2
2:4
3:0 4:8

讓我們將您的代碼分成多個部分。

set < int > s ;
map < int , int > m ;
s.insert (0);
s.insert (4);
s.insert (2);
s.insert (4);
s.insert (1);
s.insert (2);

首先,您用 integer 填充一個集合。由於 std::set 保證唯一性和順序,您的集合包含值{0, 1, 2, 4}


for ( int x : s ) {
    if ( m.count ( x ) == 0) {
        m.insert ({ x , x * 2});
    } else {
        m [ x ]++;
    }
}

現在,對於集合中的每個唯一值,您正在查看 map 上是否存在以該值作為鍵的條目。 由於您的 map 一開始是空的,因此您將始終通過此測試,而 else 部分永遠不會通過 go。

因此,您的 map 包含{[0: 0], [1: 2], [2: 4], [4: 8]}

如果您使用向量而不是集合,則某些值會重復,您的 map 將改為: {[0: 0], [1: 2], [2: 5], [4: 9]}


for ( int i = 0; i < 5; i ++) {
    cout << i << ": " << m [ i ] << endl ;
}  

最后,您在終端上打印 map 的內容。 等等,您的 map 不包含鍵3的值! 通過使用運算符[] ( https://en.cppreference.com/w/cpp/container/map/operator_at ),您已經在 map 中插入了一個默認值為 0 的值。
您應該使用方法at() ( https://en.cppreference.com/w/cpp/container/map/at ) 來檢查此 map 中是否存在元素。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM