我正在寻找正确的数据结构,以逐字母的形式存储传入流中给定类型的字符数。我事先知道字母表的大小(大约10),但是流将大约1gb。主要标准是快速访问。可以使用具有适当选择的enum
的列表来使事情更清晰,但这是最好的方法吗?
答案 0 :(得分:4)
考虑到性能要求,请考虑在内存中连续的布局;从而有助于减少缓存未命中。
喜欢的东西;
const std::size_t SIZE = 10;
int count[SIZE] = {};
// or
std::vector<int> count(SIZE, 0);
如果您需要将计数与角色一起存储,那么&#34;对&#34>可能有所帮助;
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 Sutter和Bjarne提供了一些关于为什么std::vector
应该受到青睐的材料和经验证据。与往常一样,测量应该以验证给定数据结构,算法和相关数据访问等的性能。
答案 1 :(得分:0)
一个简单的数组最有效:
int counters[SIZE_OF_ALPHABET];
答案 2 :(得分:0)
对于存储,你可以尝试制作字母表编码表和简单的char数组(char足以存储10个不同字符中的1个)。喜欢:
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个项目压缩成一个字符。