C++ 如何对std::map中的部分键进行二进制搜索?

C++ 如何对std::map中的部分键进行二进制搜索?,c++,c++11,dictionary,containers,binary-search,C++,C++11,Dictionary,Containers,Binary Search,我有一张数据地图;键是std::string。我想对它执行二进制搜索,但我不能只使用std::map::find(),因为我将只提供密钥的一部分 假设我有一张带有以下键的地图: ["abc"] -> ... ["efg"] -> ... ["ijk"] -> ... ["iik"] -> ... 我想通过搜索,比如说只提供“I”,搜索应该返回: [“ijk”]->…,[“iik”]-> 这可能吗?我曾尝试使用迭代器来实现这一点,但失败了,因为我无法将它们视为索引 注意:

我有一张数据地图;键是
std::string
。我想对它执行二进制搜索,但我不能只使用
std::map::find()
,因为我将只提供密钥的一部分

假设我有一张带有以下键的地图:

["abc"] -> ...
["efg"] -> ...
["ijk"] -> ...
["iik"] -> ...
我想通过搜索,比如说只提供
“I”
,搜索应该返回:

[“ijk”]->…,[“iik”]->

这可能吗?我曾尝试使用迭代器来实现这一点,但失败了,因为我无法将它们视为索引


注意:由于其他原因,我将数据保存在地图中,因此我不想将其更改为不同的数据结构。

将在这里帮助您。

将在这里帮助您。

这是可能的,但您不需要实际对数据进行二进制搜索


您可以使用查找第一个元素,然后推进生成的迭代器,直到您的键不再匹配您的条件,将它们存储在
或类似的容器中以返回所有元素。

这是可能的,但您不需要实际对数据进行二进制搜索


您可以使用查找第一个元素,然后推进生成的迭代器,直到您的键不再符合您的条件,将它们存储在
或类似的容器中以返回所有元素。

我根据和的建议构建了一个解决方案。此函数为要查找的映射中的第一个元素提供迭代器。该函数执行二进制搜索,因为它的复杂度是对数大小

然后,只要要查找的字符串是映射中值的前缀,就必须推进提供的迭代器。这样做的目的就是使用

为了清楚起见,我选择了
int
作为您地图的值。请将其替换为您的数据类型。总而言之,代码如下所示:

int main() {
    std::map <std::string, int> myMap{ {"abc", 1}, {"efg", 2}, {"ijk", 3}, {"iik", 4} };
    std::string prefix("i");

    for (auto it = myMap.lower_bound(prefix); it != std::end(myMap) && it->first.compare(0, prefix.size(), prefix) == 0; ++it)
        std::cout << it->first << " -> " << it->second << std::endl;

    return 0;
}
intmain(){
std::map myMap{{“abc”,1},{“efg”,2},{“ijk”,3},{“iik”,4};
std::字符串前缀(“i”);
for(auto it=myMap.lower_bound(前缀);it!=std::end(myMap)&&it->first.compare(0,prefix.size(),prefix)==0;++it)
std::cout first 3


我根据和建议构建了一个解决方案。此函数为您要查找的映射中的第一个元素提供迭代器。该函数执行二进制搜索,因为它的复杂性是对数大小

然后,只要要查找的字符串是映射中值的前缀,就必须推进提供的迭代器

为了清楚起见,我选择了
int
作为地图的值。请将其替换为数据类型。所有代码如下所示:

int main() {
    std::map <std::string, int> myMap{ {"abc", 1}, {"efg", 2}, {"ijk", 3}, {"iik", 4} };
    std::string prefix("i");

    for (auto it = myMap.lower_bound(prefix); it != std::end(myMap) && it->first.compare(0, prefix.size(), prefix) == 0; ++it)
        std::cout << it->first << " -> " << it->second << std::endl;

    return 0;
}
intmain(){
std::map myMap{{“abc”,1},{“efg”,2},{“ijk”,3},{“iik”,4};
std::字符串前缀(“i”);
for(auto it=myMap.lower_bound(前缀);it!=std::end(myMap)&&it->first.compare(0,prefix.size(),prefix)==0;++it)
std::cout first 3


像往常一样,用一个小的代码示例来展示你实际尝试过的东西!像往常一样,用一个小的代码示例来展示你实际尝试过的东西!
下限是一个二进制搜索:)我想把这个二进制搜索作为一个实现细节:)好的,从技术上讲是“二进制搜索”不在标准中;我会告诉你。但是考虑到对该函数的要求,它不可能是其他任何东西。虽然
std::map
通常使用红黑(二进制)实现tree,我看不出为什么
map
必须是一个二叉树的有力原因。我可能想提一下
是透明的
,它可以使某些类型的搜索更有效和/或更实用。
下限
是一个二叉搜索:)我想把二叉搜索作为一个实现细节:)好的,从技术上讲“二进制搜索”不在标准中;我会告诉你的。但是考虑到对该函数的要求,它不可能是其他任何东西。而
std::map
通常使用红黑(二进制)来实现树,我看不出一个强有力的理由为什么
map
必须是一个二叉树。可能需要提到的是
是透明的
,这可以使某些类型的映射更有效和/或更实用。