std::map - 递减迭代器给出奇怪的结果?

std::map - decrement iterator gives strange result?

似乎无法解决这个问题。简单例子如下:

#include <iostream>
#include <map>

int main() {

    std::map<uint32_t, char> m;
    
    m[1] = 'b';
    m[3] = 'd';
    m[5] = 'f';
    
    std::map<uint32_t, char>::iterator i = m.lower_bound('d');
    
    std::cout << "First: " << i->first << std::endl;
    
    // Decrement the iterator
    i--;
    
    // Expect to get 1, but get 5?
    std::cout << "Second: " << i->first << std::endl;

    return 0;
}

输出为:

First: 3
Second: 5

为什么我在这里得到 5?我认为递减迭代器会导致它指向键 1

lower_bound 将键作为输入,而不是值。这会如您所愿:

std::map<uint32_t, char>::iterator i = m.lower_bound(3);

对于您正在使用的 lower_bound,您最终会找到 end() 并返回一个。

这次通话

std::map<uint32_t, char>::iterator i = m.lower_bound('d');

returns 迭代器 m.end()。所以取消引用迭代器

std::cout << "First: " << i->first << std::endl;

导致未定义的行为。

成员函数 lower_bound 需要一个指定键而不是值的参数。

考虑以下演示程序。

#include <iostream>
#include <iomanip>
#include <map>
#include <cstdint>

int main()
{
    std::map<uint32_t, char> m;

    m[1] = 'b';
    m[3] = 'd';
    m[5] = 'f';

    std::map<uint32_t, char>::iterator i = m.lower_bound( 'd' );

    std::cout << "i == m.end() is " << std::boolalpha << ( i == m.end() ) << '\n';
}

程序输出为

i == m.end() is true

相反,你可以这样写

std::map<uint32_t, char>::iterator i = m.lower_bound( 5 );

在本次调用后递减迭代器后

std::map<uint32_t, char>::iterator i = m.lower_bound('d');

它指向地图的最后一个元素。