如何高效搜索constexpr初始化的已排序结构体键值数组?
基于排序结构体数组的高效二分搜索需求
我需要在源码中用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构造、更适合高效搜索的容器; - 编写仅基于键字段搜索的自定义二分搜索模板函数;
- 将键和值拆分为两个独立数组,但这会增加代码维护出错风险。
欢迎提供其他解决方案。
内容的提问来源于stack exchange,提问作者InTheWonderlandZoo
相关产品推荐
相关产品推荐

