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');
它指向地图的最后一个元素。
似乎无法解决这个问题。简单例子如下:
#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');
它指向地图的最后一个元素。