Использовать индекс номинальных значений вместо строкового значения - PullRequest
0 голосов
/ 17 ноября 2018

Я работаю в системах реального времени, которые получают дискретные значения в текстовом формате (из текстового файла или буфера).Мне нужно собирать статистику и выполнять другую числовую обработку этих значений, чтобы ускорить процесс. Я думал об использовании целого числа (например, индекса) вместо std::string.

Allowed Values:
Black, Red, Green
After transformation:
0,1,2 (respectively)

. Я также хочудля управления недопустимыми значениями, например, yellow будет недействительным, поскольку это недопустимое значение.

Поэтому в любое время t я получаю значение и мне нужно проанализировать его по индексу,а затем использовать его.ПРЕДУПРЕЖДЕНИЕ: задержка действительно важна, и мне нужно, чтобы она была настолько быстрой, насколько я могу.

Какой подходящий высокопроизводительный способ реализовать это?

1 Ответ

0 голосов
/ 28 июня 2019

Если важна скорость, то таблицы поиска всегда являются быстрым решением.А C ++ предлагает ассоциативные контейнеры.

Соответствующим решением является карта.

См. Следующий пример:

#include <string>
#include <map>
#include <iostream>


using KeyType = std::string;
using LookUpValue = int;
using LookUpTable = std::map<KeyType,LookUpValue>;

LookUpTable lookUpTable {{"Black",1}, {"Red",2}, {"Green",3}};

constexpr LookUpValue InvalidInput{0};

inline LookUpValue convertTextToKey(const std::string& text)
{
    return (lookUpTable.end()==lookUpTable.find(text)) ? InvalidInput : lookUpTable[text];
}

int main()
{
    std::cout << convertTextToKey("Nonsense") << ' ' << convertTextToKey("Black") << ' '  
              << convertTextToKey("Red") << ' ' << convertTextToKey("Green") << '\n';
    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...