2010-02-01 51 views
2

我已經創建了一個容器,可以通過下標操作符訪問泛型的弱類型數據。通過同一運營商的容器訪問和分配?

std::map容器允許通過運營商的數據訪問和元素插入,而std::vector我認爲沒有。

什麼是最好的(C++風格)的方式來進行?我應該允許通過下標運算符分配還是使用單獨的插入方法?

編輯

我應該說,我不是問我是否應該使用矢量地圖或者,我只是想知道是什麼人想過訪問和插入以這種方式進行組合。

+1

什麼樣的容器?有'std :: map'和'std :: vector'行爲的原因;這是你的容器更像? – 2010-02-01 14:44:10

+0

Re:你的編輯。這仍然取決於你的班級做什麼。 map的行爲在C++中是相當獨特的,它的'operator []'提供了一個非常特殊的功能。 – UncleBens 2010-02-01 22:52:07

回答

0

單獨的插入方法,當然。 std::map上的operator[]僅僅是愚蠢的,並且使得代碼難以閱讀和調試。 如果你正在使用operator[]插入(這將導致非常規癌症const-cancer的更偶然的表兄弟),您也無法訪問來自const上下文的數據。

+0

「查找和更新,如果密鑰存在,否則插入默認和更新」是我總是發現自己與Python的字典戰鬥。 'std :: map :: operator []'有一個非常明確的目的。如果它不這樣工作,如果密鑰不存在會發生什麼?簡單的未定義的行爲?那麼它將如何可用呢?你是否說這裏不應該有其他有用的方法,因爲如果你只是想查找,它是沒有用的。來吧,這個語言甚至可以保護你在常量上下文中不正確地使用它進行查找。 – UncleBens 2010-02-01 22:47:27

+0

我同意有某種保護措施,因爲它不能在const上下文中使用。不過,是的,與std :: vector \ deque或任何其他使用[]運算符的容器一樣,使用它意味着您確定index \ key存在,否則使用map :: find函數。 – 2010-02-02 09:02:16

+0

與我知道「鍵」0 ...大小的vector/deque不同,使用map無法知道哪些鍵存在(除非將所有鍵存儲在其他位置 - 當然,您可以使用find()進行測試,但是使用[]訪問該值將毫無意義)。我不知道你,但如果我不在乎密鑰是否存在,我使用map的索引運算符,因爲添加默認值正是我想要的。 – UncleBens 2010-02-02 15:56:48

2

在矢量的情況下:下標符號不插入 - 它覆蓋。

這篇文章的其餘內容下蒸餾從Effective STL項目1-5的信息。

如果你知道你的數據的前手的範圍 - 和大小是固定的 - 你會不會在位置插入它有它上面的數據 - 那麼你可以插入使用到載體中沒有令人不快的副作用。

但是在一般情況下,載體插入具有影響,如罄呈向上移成員和加倍的內存(這將導致從舊矢量的對象拷貝的洪水向新的向量位置)當你做出特設插入。矢量是專爲當你知道你的數據的局部性特徵。

向量附帶一個插入成員函數...這個函數是非常聰明的大多數實現,因爲它可以從你的供應的迭代器推斷優化。你不能用這個嗎?

如果你想做臨時插入的數據,你應該使用一個列表。也許你可以使用一個列表來收集數據,然後一旦它的最終化使用基於範圍的插入或基於範圍的構造函數填充矢量?

+1

在挑選對象的過程中,通常不可能在生成向量時使用memcpy()。有必要調用複製構造函數。 – 2010-02-01 14:45:36

+0

@大衛(+1)你確實是對的,我已經更新了文字(我傾向於抽象)。複製構造函數甚至比memcpy更糟:D – 2010-02-01 14:48:17

+1

'std :: map :: operator []'如果鍵存在,則返回該值,否則*插入該鍵的默認對象並返回該值。由於它是通過引用返回的,所以可以覆蓋它。 – UncleBens 2010-02-01 16:12:23

1

它取決於你想要的。如果你想使用像數組這樣的東西,地圖可以比矢量慢得多。如果您要使用的索引是非順序的,並且您有負載,則映射非常有用。通常只需使用一個矢量,對它進行排序並進行二分搜索,以查找您所追求的內容通常會更快。我用這種方法來替換大量軟件中的地圖,但我仍然沒有發現用矢量做這件事的速度慢的問題。

因此,國際海事組織,性病::向量是更好的辦法,但如果你正確地使用它的地圖可能是有用的。