2010-10-20 25 views
3

我需要做的是打開一個文本文件,用0和1來查找文件中各列之間的模式。如何管理C++中的位/二進制文件?

所以我首先想到的是每一列解析成的bool的一個大的陣列,然後執行列(現在在陣列)之間的邏輯。直到我發現bools的大小實際上是一個字節沒有,所以我會浪費1/8的內存,將每個值分配給一個布爾值。

它在800x800值的網格中甚至相關嗎?處理這個問題的最佳方法是什麼? 我將不勝感激的代碼片斷的情況下,它是一個複雜的答案

+3

您幾乎肯定會過早地進行優化 - 我真的只會編寫算法,然後在必要時進行增量更改以提高性能。 – 2010-10-20 03:50:52

+1

你到目前爲止做了什麼?你有多遠,遇到什麼問題?你有什麼問題? (或者你希望我們爲你寫這一切嗎?) – abelenky 2010-10-20 03:51:02

+0

嗨,感謝您的快速答案! – Agush 2010-10-20 04:02:11

回答

4

可以使用std::vector<bool>這是一種使用布爾緊湊店.... 1位不是8位矢量的一個特例。

+0

謝謝,我相信這回答我的問題......但最終似乎我不會需要它haha – Agush 2010-10-20 04:14:19

1

對於這個尺寸的網格,你的布爾數組大小約爲640KB。取決於你有多少內存,如果這將是一個問題。它可能是邏輯分析代碼最簡單的。

通過分組的比特,並在陣列中存儲詮釋你可以掉落存儲要求80KB,但邏輯代碼會更復雜,因爲你會一直出您要檢查的位。

+0

謝謝我也想到了這一點,也許將8個值分組到一個字符,但實施更難像我這樣的noob,現在我知道,好處是不值得的 – Agush 2010-10-20 04:21:58

2

我認爲這是誰克努特說:「過早的優化是所有罪惡的根源。」讓我們更多地瞭解這個問題。你的數組是800 ** 2 == 640,000字節,對於比數字手錶更強大的任何東西都沒什麼大不了的。

雖然把它作爲字節似乎浪費 - 正如你所說,內存的7 /是3/8冗餘 - 但另一方面,大部分機器都不能有效地做到位操作爲字節;通過保存內存,您可能會浪費很多精力來掩蓋和測試,以至於使用字節模型會更好。

在另一方面,如果你想用它做的是尋找更大的模式是什麼,你可能想使用按位表示,因爲你可以在每次8位做的事情。

這裏真實的一點是有幾種可能性,但是沒有人可以在不知道問題出在哪裏的情況下告訴你「正確」的表示。

+0

非常感謝您的意見。正如你所說,我正在做過早的優化,因爲這可以運行在「比數字手錶更強大的任何東西上」,只是它看起來像是在浪費很多空間,但我也不知道PC處理字節更多有效比比特,所以我認爲,再加上更容易的實現抵消了內存冗餘「問題」。 – Agush 2010-10-20 04:18:17

4

您可以使用std::bitset或Boosts dynamic_bitset,它們提供了不同的方法來幫助您管理您的位。

他們爲其創建其他默認類型,如int或字符位集例如支持構造函數。您也可以將位集導出爲ulong或字符串(然後可以再次變成bitset)

我曾經問過關於連接這些的問題,但這些問題並不可行。但也許你可以使用那個question的信息。