2011-04-13 63 views
19

在C++ 0x中有沒有可用的替代Boost的bimap?在C++ 11中有沒有Boost.Bimap的替代品?

我想避免Boost,但完全擁抱C++ 11。如果有必要,Boost的bimap的精簡版將適用於我(我需要一個不斷的bimap在枚舉和相應的字符串之間切換)。該地圖將是編譯時常量,因此甚至可能是兩個手動維護的地圖也不是最佳解決方案。

謝謝!

更新:我發現這個的代碼項目,但它似乎許可可能是一個問題:http://www.codeproject.com/KB/stl/bimap.aspx?fid=12042&df=90&mpp=25&noise=3&sort=Position&view=Quick&fr=151#xx0xx

我只是在尋找一個乾淨和簡單的解決方案(一個頭/源文件或一點額外的,如在我的情況下,兩個鏡像地圖是相同的)。

+5

爲什麼你想避免使用提升?如果它解決了你的問題......請注意,boost包含許多不同的庫,其中一些將其納入標準中,但其中許多庫過於具體,無法添加到標準中。 – 2011-04-13 10:29:23

+0

@David:我明白了,但1)Windows上的Boost是一件麻煩事,2)我想用這個項目學習C++;我知道Boost是C++,它是學習它的好方法,但我想看看我可以自己做什麼並發現已經存在的功能。奇怪的解釋我知道,但Boost中的所有內容(我需要)都需要非頭文件,至少是很大的東西。我現在已經可以很簡單地避免/解決Boost問題了,我想保持這種狀態。我已經將問題簡化爲一個容器包裝器,它基本上保留了兩個地圖的更新,這對你自己來說並不是一件很難的事情。 – rubenvb 2011-04-13 11:07:35

+5

如何在Windows上增加一些麻煩,特別是在討論boost.bimap這種僅包含頭文件的庫時?提取標題,將它們添加到包含目錄中,完成。 – ildjarn 2011-04-13 19:45:18

回答

10

我的感覺是很多是進入Boost庫的工作是讓他們與其他庫/ STL工作。

如果您不需要該功能,則可以使用std::map<X*, Y*>std::map<Y*, X*>的課程。然後有如下方法:add(X,Y),remove(X,Y),get_left(X)get_right(Y)

如果要存儲副本,add(X,Y)可以分配內存,並且remove(X,Y)可以取消分配。此外,您可以定義一個析構函數,在其餘元素上調用remove(X,Y)

+0

不應該是這樣std:地圖和std ::地圖 Gio 2017-08-23 18:01:05

39

簡答題:沒有。

長答案:不。


應當指出的是,C++ 1 的對transparent comparators支持消除了時間* Boost.Bimap 90%的需求:當你需要關閉的任何加鍵給定的屬性(存儲或計算),通常是一個簡單的,按位可比的唯一標識符固有/存在於對象中。使用透明比較器,只要所述值可以從對象中獲取/計算而不會突變,就可以將對象與任何可能的值進行比較,只能根據類型進行區分。

*一個瞎猜,不是統計

+10

我不知道爲什麼這是如此upvoted - 我認爲一個更好的「長答案」將是一個簡短的解釋,爲什麼它不被認爲是必要的;什麼會是一個更習慣的方法。我想很多人(我當然有罪)在他們試圖以非C++方式一起破解一些東西的時候偶然發現了Boost, OP想要避免學習是件好事,我認爲(不是因爲我分享它)。 – OJFord 2015-03-19 16:36:58

+2

@OllieFord:這是一個相當含糊的笑話,因爲「不」不是太短而不能作爲自己的答案發布。 ; - ] – ildjarn 2015-03-23 01:00:38

+2

那麼透明比較器如何幫助定義枚舉<->字符串bimap?這將使這個答案實際上回答我的問題。目前,它看起來像一個C++ 14功能的淺廣告,沒有任何用處。 – rubenvb 2017-01-23 10:36:39