C++11 为什么对于大小为1的映射,std::map::lower_bound会失败?

C++11 为什么对于大小为1的映射,std::map::lower_bound会失败?,c++11,map,gcc,standard-library,clang,C++11,Map,Gcc,Standard Library,Clang,我可能偶然发现了一个bug,但这可能只是他们实现标准库的方式。以下是一个bug吗 在gcc 4.8.2和clang 3.4中,如果我在只有一个元素的映射上使用std::map::lower_bound(),即使映射中的元素是一个下限,它也会返回end()。请参见下面的示例代码 如果您想测试这个,请确保使用以下编译选项:-std=c++11 #include <cstdlib> #include <iostream> #include <map> #defin

我可能偶然发现了一个bug,但这可能只是他们实现标准库的方式。以下是一个bug吗

在gcc 4.8.2和clang 3.4中,如果我在只有一个元素的映射上使用std::map::lower_bound(),即使映射中的元素是一个下限,它也会返回end()。请参见下面的示例代码

如果您想测试这个,请确保使用以下编译选项:-std=c++11

#include <cstdlib>
#include <iostream>
#include <map>

#define ts_t std::pair<uint64_t,uint64_t>

int main() {

    std::map<ts_t,uint32_t> test;

    uint32_t count = 0;

    test.insert(std::make_pair(
        std::make_pair(1403187740ull,698599ull),
        count++
    ));

    ts_t key = std::make_pair(1403187740ull,698600ull);

    auto lower = test.lower_bound(key);
    auto upper = test.upper_bound(key);

    if(lower==test.end()) std::cout<<"no lower bound\n";
    if(upper==test.end()) std::cout<<"no upper bound\n";
    if(test.begin()->first < key) std::cout<<"key is less than begin()\n";

    test.insert(std::make_pair(
        std::make_pair(1403187740ull,698601ull),
        count++
    ));

    lower = test.lower_bound(key);
    upper = test.upper_bound(key);

    if(lower==test.end()) std::cout<<"no lower bound\n";
    if(upper==test.end()) std::cout<<"no upper bound\n";
    if(test.begin()->first < key) std::cout<<"key is less than begin()\n";

    return EXIT_SUCCESS;
}
我希望看到:

no upper bound
key is less than begin()
key is less than begin()
更新:在回答之后,我写了这个更新的代码,它完成了我想要的。我把它贴在这里,以防其他人试图完成同样的事情:

#include <cstdlib>
#include <iostream>
#include <map>

#define ts_t std::pair<uint64_t,uint64_t>

int main() {

    std::map<ts_t,uint32_t> test;

    uint32_t count = 0;

    test.insert(std::make_pair(
        std::make_pair(1403187740ull,698599ull),
        count++
    ));

    ts_t key = std::make_pair(1403187740ull,698600ull);

    std::map<ts_t,uint32_t>::iterator upper = test.upper_bound(key);
    std::map<ts_t,uint32_t>::iterator lower;
    if(upper==test.begin()){
        lower = test.end();
    } else {
        lower = upper;
        --lower;
    }

    if(lower==test.end()) std::cout<<"no lower key\n";
    if(upper==test.end()) std::cout<<"no upper bound\n";
    if(test.begin()->first < key) std::cout<<"key is less than begin()\n";

    test.insert(std::make_pair(
        std::make_pair(1403187740ull,698601ull),
        count++
    ));

    lower = test.lower_bound(key);
    upper = test.upper_bound(key);

    if(lower==test.end()) std::cout<<"no lower key\n";
    if(upper==test.end()) std::cout<<"no upper bound\n";
    if(test.begin()->first < key) std::cout<<"key is less than begin()\n";

    return EXIT_SUCCESS;
}
#包括
#包括
#包括
#定义ts_t std::pair
int main(){
标准:map试验;
uint32_t计数=0;
测试.插入(标准::制作\u对(
标准:制造成对(1403187740ull,698599ull),
计数++
));
ts_t key=std::make_对(1403187740ull,698600ull);
std::map::迭代器上限=测试。上限(键);
std::map::iterator lower;
if(上限==test.begin()){
lower=test.end();
}否则{
下=上;
--较低;
}

如果(lower==test.end())std::cout您误解了
下限的含义。它并不意味着它下面的元素;它意味着不小于的第一个元素,即大于或等于

此函数的目的是使范围
下限
上限
匹配与搜索键相等的所有元素

#include <cstdlib>
#include <iostream>
#include <map>

#define ts_t std::pair<uint64_t,uint64_t>

int main() {

    std::map<ts_t,uint32_t> test;

    uint32_t count = 0;

    test.insert(std::make_pair(
        std::make_pair(1403187740ull,698599ull),
        count++
    ));

    ts_t key = std::make_pair(1403187740ull,698600ull);

    std::map<ts_t,uint32_t>::iterator upper = test.upper_bound(key);
    std::map<ts_t,uint32_t>::iterator lower;
    if(upper==test.begin()){
        lower = test.end();
    } else {
        lower = upper;
        --lower;
    }

    if(lower==test.end()) std::cout<<"no lower key\n";
    if(upper==test.end()) std::cout<<"no upper bound\n";
    if(test.begin()->first < key) std::cout<<"key is less than begin()\n";

    test.insert(std::make_pair(
        std::make_pair(1403187740ull,698601ull),
        count++
    ));

    lower = test.lower_bound(key);
    upper = test.upper_bound(key);

    if(lower==test.end()) std::cout<<"no lower key\n";
    if(upper==test.end()) std::cout<<"no upper bound\n";
    if(test.begin()->first < key) std::cout<<"key is less than begin()\n";

    return EXIT_SUCCESS;
}