Вот простой пример того, что я имею в виду:
Код: Выделить всё
struct MyArrayElement { const char* key, int value };
constexpr MyArrayElement MyArray[] = {
{ "abc", 923 },
{ "def", 456 },
/* ... */
{ "xyz", 178 },
};
Код: Выделить всё
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; });
Я просмотрел std::binary_search, но похоже, что он хочет приравнять весь элемент (т.е. и ключ, и значение), а я хочу указать только ключ в предикате поиска.
Я просмотрел различные алгоритмы STL, но не нашел ничего такого, что бы делало то, что мне нужно. Я всегда мог бы легко написать свою собственную функцию шаблона двоичного поиска, но я надеялся использовать готовый стандартный алгоритм.
Итак, это мои потенциальные варианты в порядке от наиболее предпочтительного к наименее предпочтительному. :
- Попробуйте найти другой стандартный алгоритм, который выполняет двоичный поиск только по ключевому полю структуры.
- Попробуйте найти другой контейнер, который можно сконструировать constexpr и который лучше предназначен для эффективного поиска.
- Напишите собственную функцию шаблона двоичного поиска, которая будет выполнять поиск только по ключевому полю.
- Разделите структуры ключей и значений на два отдельных массива, но это, несомненно, сделает поддержку кода более подверженной ошибкам, поскольку они будут находиться в разных строках исходного кода. br />
Подробнее здесь: https://stackoverflow.com/questions/788 ... fficiently