Поскольку количество возможных символов ограничено до 8, вы можете использовать перечисление.Следовательно, вам нужно всего 3 бита для представления каждого «символа».Вы можете упаковать несколько этих 3-битных «символов» в короткое целое число, используя bitfields .Полученное упакованное целое число становится индексом вашего vector<SomeData>
.
Пространство, занятое этим вектором, будет space_of_SomeData * 2^(3*number_of_spaces)
.Если, например, number_of_spaces
равно 4, это приводит к 4096*space_of_SomeData
.Это может привести к некоторой потере памяти, но поиск и вставка должны быть очень быстрыми.
Вот пример кода:
#include <vector>
enum CharSet
{
ampersand,
pound,
letterOh,
percent,
dollar,
exclamation
};
struct CompositeIndex
{
union
{
struct // Bitfield
{
unsigned c0 : 3; // 3 bits
unsigned c1 : 3; // 3 bits
unsigned c2 : 3; // 3 bits
unsigned c3 : 3; // 3 bits
} chars;
unsigned int index;
};
};
unsigned int lookup(CharSet c0, CharSet c1, CharSet c2, CharSet c3)
{
CompositeIndex ci;
ci.chars.c0 = c0;
ci.chars.c1 = c1;
ci.chars.c2 = c2;
ci.chars.c3 = c3;
return ci.index;
}
typedef int SomeClass;
int main(int argc, char* argv[])
{
std::vector<SomeClass> vec(100);
vec[lookup(ampersand, percent, dollar, pound)] = 42;
}
Если вам абсолютно необходимо работать с char
символами, выможет легко создать таблицу поиска из 256 элементов, которая быстро преобразует символы 'char' в CharSet
значения.
Как уже обсуждалось другими, вы можете использовать std::map<std::string, SomeData>
или даже (возможно, быстрее) std::map<char[4], SomeData, Comparitor>
.Если приблизительное распределение частот различных последовательностей символов известно, попробуйте сначала вставить наиболее частые шаблоны в карту.В зависимости от внутренней реализации карты это может ускорить поиск наиболее частых шаблонов (они находятся в верхней части базового дерева двоичного поиска).