Constexpr отсортировал массив значения ключа структуры, как его эффективно искать?C++

Программы на C++. Форум разработчиков
Anonymous
Constexpr отсортировал массив значения ключа структуры, как его эффективно искать?

Сообщение Anonymous »

У меня есть длинный массив данных «ключ+значение», который я хотел бы инициализировать в исходном коде с помощью инициализатора constexpr. Я могу самостоятельно отсортировать массив в исходном коде, чтобы его можно было эффективно искать с помощью алгоритма двоичного поиска. Структура состоит из ключевой части и одной (или нескольких) частей значений.
Вот простой пример того, что я имею в виду:

Код: Выделить всё

struct MyArrayElement { const char* key, int value };
constexpr MyArrayElement MyArray[] = {
{ "abc", 923 },
{ "def", 456 },
/* ... */
{ "xyz", 178 },
};
Я могу использовать алгоритм STL "find_if" для поиска ключа:

Код: Выделить всё

std::string key_to_find{ "xyz" };
auto const elem = find_if(std::begin(MyArray), std::end(MyArray),
[&key_to_find](auto const& elem){ return key_to_find == elem.key; });
Поскольку алгоритм find_if не может знать, что я отсортировал ключи, он не сможет воспользоваться этими знаниями для эффективного поиска в массиве.
Я просмотрел std::binary_search, но похоже, что он хочет приравнять весь элемент (т.е. и ключ, и значение), а я хочу указать только ключ в предикате поиска.
Я просмотрел различные алгоритмы STL, но не нашел ничего такого, что бы делало то, что мне нужно. Я всегда мог бы легко написать свою собственную функцию шаблона двоичного поиска, но я надеялся использовать готовый стандартный алгоритм.
Итак, это мои потенциальные варианты в порядке от наиболее предпочтительного к наименее предпочтительному. :
  • Попробуйте найти другой стандартный алгоритм, который выполняет двоичный поиск только по ключевому полю структуры.
  • Попробуйте найти другой контейнер, который можно сконструировать constexpr и который лучше предназначен для эффективного поиска.
  • Напишите собственную функцию шаблона двоичного поиска, которая будет выполнять поиск только по ключевому полю.
  • Разделите структуры ключей и значений на два отдельных массива, но это, несомненно, сделает поддержку кода более подверженной ошибкам, поскольку они будут находиться в разных строках исходного кода. br />
Я открыт для других идей о том, как решить эту проблему.

Подробнее здесь: https://stackoverflow.com/questions/788 ... fficiently

Вернуться в «C++»