Как уже упоминалось, Boost.MultiIndex - это один из способов решения такой проблемы.Это очень мощный и быстрый , но в большинстве случаев это просто означает медленную компиляцию и сложный код , при этом не получая много других преимуществ.
65 элементов не так уж много икак отметил Марк Рэнсом, линейный поиск может работать достаточно хорошо для того, что вы делаете.Это вам нужно измерить.
Другой способ сделать что-то - это иметь std :: vector для хранения сообщений (65 сообщений), а затем вы можете иметь два отдельных контейнера, которые вы используете для поиска: first это id-to-index, а second это имя-to-index.Индекс - это позиция сообщения в векторе.Примерно так:
class YourContainerClass
{
public:
bool lookupById(unsigned char id, PDCUTestMessage& message)
{
std::map<unsigned char, int>::iterator it = idToIndexMap.find(id);
if (it == idToIndexMap.end())
return false;
message = messages[*it];
return true;
}
bool lookupByName(const std::string& name, PDCUTestMessage& message)
{
std::map<std::string, int>::iterator it = nameToIndexMap.find(id);
if (it == nameToIndexMap.end())
return false;
message = messages[*it];
return true;
}
private:
std::vector<PDCUTestMessage> messages;
std::map<unsigned char, int> idToIndexMap;
std::map<std::string, int> nameToIndexMap;
};
Чтобы управлять внутренними контейнерами, ваша вставка должна выполнить команду push_back в векторе сообщений и одновременно вставить в две карты соответствующие вещи, чтобы найти индекс в вектореот идентификатора и имени.
Это всего лишь один из способов, как будет выглядеть API.Вы также можете обернуть сообщения в boost :: shared_ptr , чтобы получить немного другой API.Это несколько выходит за рамки вашего вопроса, потому что я также не знаю, как вы намереваетесь использовать сообщения и их время жизни.
Я бы сказал, даже если Boost.MultiIndex - очень крутой контейнер, он не долженбудь первым вариантом.Есть много способов сделать это, и это сводится к конкретным проблемам, которые наиболее важны.
Надеюсь, вы найдете то, что имеет для вас наибольшее значение.