2013-12-19 27 views
0

我在看書C++ Primer 5th Edition。從它的練習是有點模糊,讓我感到困惑。它會爲是否可以使用地圖迭代器爲地圖的元素賦值?

練習11.16:使用地圖迭代器寫 的值賦給一個元素的表達(頁431)

我使用std::copystd::insertor複製知道它可以做到的。從一個容器到地圖的一系列元素。但是這個練習是否真的暗示了這種方法?是否可以使用地圖迭代器而不是std::insertor來插入成員函數?

更新:

這個問題已經被縮小範圍到: 是否可以更換或添加使用地圖迭代器的鍵值對,而不是std::insertor也不插入成員函數?

+1

對我來說,聽起來更像是要替換已存儲在地圖中的元素。就像,使用迭代器獲取元素,然後通過賦值運算符分配一個新對象,該元素將被替換,仍然可以通過同一個鍵/迭代器訪問。沒什麼大不了的,但這就是我理解這句話的方式。 – ypnos

+8

如果你問你是否可以設置給定迭代器的key值,那麼你可以,特別是通過'it-> second = newValue;' – WhozCraig

+0

@WhozCraig Thx男士。我知道你的意思,並確定你的代碼工作。但我不太確定這是鍛鍊想要的。 –

回答

2

A std::map<A,B>具有std::pair<const A, B>類型的元素,而不是std::pair<A,B>。爲什麼?

只是爲了防止你打破地圖排序。因爲地圖依靠比較器來排序元素並快速訪問它們。在地圖上進行操作時,必須保留元素的相對順序。

想象一下,您的地圖包含{1, "foo"},{2, "bar"}{3, "foobar"}。如果在迭代過程中,您可以用{4, "foo"}代替{1, "foo"},那麼迭代結束時的映射必須完全重新平衡。

不是最佳的,不是嗎?

所有這些文字說,我認爲你的問題只是修改鍵/值對的值部分。你有很多方法可以做到這一點,迭代和使用iterator->second = new_value;是最常見的。