2014-11-03 81 views
0

我正在尋找正確的數據結構來存儲輸入流中給定類型的字符數,逐個字母。我事先知道字母的大小(大約10),但流將大約1GB。主要標準是快速訪問。可以使用適當選擇的列表enum來使事情更清楚,但這是最好的方法嗎?C++正確的數據結構

+0

「最好」的方式取決於環境和個人意見。如何處理地圖(char值 - >長整數)? – deviantfan 2014-11-03 10:35:12

+1

數據結構的目的是什麼?存儲數據?處理? – 2014-11-03 10:35:22

+0

連續的int count [10]或者std :: vector count(10,0)'。但我認爲這取決於您將使用的算法。 – Niall 2014-11-03 10:37:03

回答

4

鑑於性能要求,考慮一個佈局即在存儲器相鄰的;從而幫助減少緩存未命中。

有點像;

const std::size_t SIZE = 10; 
int count[SIZE] = {}; 
// or 
std::vector<int> count(SIZE, 0); 

如果您需要與字符一起將計,那麼,「對」可以幫助;

struct Datum { 
    Datum() : c('\0'), count(0) {} 
    char c; // assuming the "alphabet" is in the char range 
    int count; 
}; 

std::vector<Datum> count(SIZE); 

Herb SutterBjarne提供一些材料和經驗證明,爲什麼std::vector應該受到青睞。與往常一樣,測量應作出驗證性能給你的數據結構,算法和相關數據訪問等

+1

'int count [256];'可以避免間接字符串 - >索引。 – Jarod42 2014-11-03 10:47:32

0

一個簡單的陣列將最佳工作:

int counters[SIZE_OF_ALPHABET];

0

爲了存儲你可以嘗試讓字母編碼表和簡單的字符數組(char是足以存儲的1 10個不同的字符)。像:

map<int, char> m; 
m['A'] = 1; 
m['B'] = 2; 
... 
char data[SIZE]; 

for(int i = 0; i < SIZE; i++){ 
    int ch = read(); 
    data[i] = m[ch]; 
} 

或將2個項目壓縮成一個字符。