2016-11-22 94 views
0

我需要能夠在C++中存儲二進制數組,它將通過不同的方法傳遞並最終輸出到文件和終端,我應該使用一個位集還是一個向量? C++

向量和位集之間的關鍵區別是什麼?最簡單和/或更有效的使用?

(我不知道我需要多少位來存儲)

+3

你可能會過問你的問題([XY](http://xyproblem.info/)?)。提示:計算機內部的所有數字都是二進制的;無論如何, – Drop

+1

bitsets是編譯時確定的大小。 – jaggedSpire

+0

你還提到一個'數組' - 你有一個固定大小的數字集合嗎?你想用他們做什麼? – doctorlove

回答

1

這一切都取決於你想做什麼二進制。

你也可以使用boost.dynamic_bitset這就像std :: bitset,但不是固定位。 如果還沒有使用它,主要缺點是依賴於boost。

您還可以將輸入存儲在std::vector<char>中,並使用每個字符的位集來轉換二進制符號。

正如其他人已經告訴:std :: bitset使用固定的位數。

std::vector<bool>並不總是建議,因爲它有它的怪癖,因爲它如果你沒有任何具體的上限,你需要存儲的數字的大小是不是真正的容器(gotw

0

如果你不知道你需要多少位在編譯時存儲,您不能使用bitset的,因爲它的大小是固定的。正因爲如此,你應該vector<bool>,因爲它可以動態調整大小。如果你想要這樣保存一些位,你可以使用vector< vector<bool> >

+0

驚訝這麼多人都推薦'矢量'。 –

1

std::bitset尺寸在編譯時應該知道,所以你的選擇很明顯 - 使用std::vector<bool>。 由於它的實現與std::vector<char>不一樣(因爲單個元素需要一點點,而不是一個完整的char),它應該是內存使用方面的一個很好的解決方案。

+2

注意使這種高效的專業化,並閱讀文檔。它確實打破了一些關於矢量如何表現的假設。 –

0

我認爲在你的情況下,你應該使用std::vector的值類型std::bitset。使用這種方法,您可以將「二進制數」視爲字符串或某些整數類型的對象,同時可以輕鬆執行二進制操作,如設置或重置位。

+0

我不認爲這是可能的,因爲他不知道他需要存儲多少比特。 –

+0

@HonzaDejdar所有整數類型都有固定的位數。所以沒有問題。:) –

+0

如果他不需要存儲更大的數字,比肯定。我從OP那裏想到,他根本不知道他需要存儲多少比特。 –

0

,然後您需要將數據存儲在兩個不同的維度中:

  • 第一維將是數量,其大小會變化。
  • 第二維將是你的數組數組。

對於後者,如果要求值在內存中是連續的,則使用std:vector就可以了。對於數字本身,您根本不需要任何數據結構:只需使用new和無符號基元類型(如unsigned char,uint8_t或其他任何其他值)分配內存(如果有對齊限制)。

另一方面,如果您知道您的數字不會超過64位,那麼請使用您知道將存儲此數據量的數據類型,例如uint64_t。 PS:記住你存儲的是數字。計算機會將它們存儲爲二進制文件,無論您是使用它們還是使用其他任何表示形式。

相關問題