map中的lower_bound和upper_bound的意思其实很简单,就两句话:
map::lower_bound(key):返回map中第一个大于或等于key的迭代器指针
map::upper_bound(key):返回map中第一个大于key的迭代器指针
所以,理解这两个函数请不要按照字面意义思考太复杂,因为仅仅是不小于(lower_bound)和大于(upper_bound)这么简单。
看两个msdn里的例子
1 // map_upper_bound.cpp 2 // compile with: /EHsc 3 #include <map> 4 #include <iostream> 5 6 int main( ) 7 { 8 using namespace std; 9 map <int, int> m1; 10 map <int, int> :: const_iterator m1_AcIter, m1_RcIter; 11 typedef pair <int, int> Int_Pair; 12 13 m1.insert ( Int_Pair ( 1, 10 ) ); 14 m1.insert ( Int_Pair ( 2, 20 ) ); 15 m1.insert ( Int_Pair ( 3, 30 ) ); 16 17 // 返回m1中第一个key值大于2的元素的迭代器,当然是<3,30> 18 m1_RcIter = m1.upper_bound( 2 ); 19 cout << "The first element of map m1 with a key " 20 << "greater than 2 is: " 21 << m1_RcIter -> second << "." << endl; 22 23 // If no match is found for the key, end is returned 24 m1_RcIter = m1. upper_bound ( 4 ); 25 26 // m1中key值并没有大于或等于4的 27 if ( m1_RcIter == m1.end( ) ) 28 cout << "The map m1 doesn't have an element " 29 << "with a key greater than 4." << endl; 30 else 31 cout << "The element of map m1 with a key > 4 is: " 32 << m1_RcIter -> second << "." << endl; 33 34 // The element at a specific location in the map can be found 35 // using a dereferenced iterator addressing the location 36 m1_AcIter = m1.begin( ); 37 m1_RcIter = m1. upper_bound ( m1_AcIter -> first ); 38 cout << "The 1st element of m1 with a key greater than\n" 39 << "that of the initial element of m1 is: " 40 << m1_RcIter -> second << "." << endl; 41 }
The first element of map m1 with a key greater than 2 is: 30. The map m1 doesn't have an element with a key greater than 4. The 1st element of m1 with a key greater than that of the initial element of m1 is: 20.
1 // map_lower_bound.cpp 2 // compile with: /EHsc 3 #include <map> 4 #include <iostream> 5 6 int main( ) 7 { 8 using namespace std; 9 map <int, int> m1; 10 map <int, int> :: const_iterator m1_AcIter, m1_RcIter; 11 typedef pair <int, int> Int_Pair; 12 13 m1.insert ( Int_Pair ( 1, 10 ) ); 14 m1.insert ( Int_Pair ( 2, 20 ) ); 15 m1.insert ( Int_Pair ( 3, 30 ) ); 16 //key值大于等于2的是<2,20> 17 m1_RcIter = m1.lower_bound( 2 ); 18 cout << "The first element of map m1 with a key of 2 is: " 19 << m1_RcIter -> second << "." << endl; 20 21 // If no match is found for this key, end( ) is returned 22 m1_RcIter = m1. lower_bound ( 4 ); 23 24 if ( m1_RcIter == m1.end( ) ) 25 cout << "The map m1 doesn't have an element " 26 << "with a key of 4." << endl; 27 else 28 cout << "The element of map m1 with a key of 4 is: " 29 << m1_RcIter -> second << "." << endl; 30 31 // The element at a specific location in the map can be found 32 // using a dereferenced iterator addressing the location 33 m1_AcIter = m1.end( ); 34 m1_AcIter--; 35 m1_RcIter = m1. lower_bound ( m1_AcIter -> first ); 36 cout << "The element of m1 with a key matching " 37 << "that of the last element is: " 38 << m1_RcIter -> second << "." << endl; 39 }
The first element of map m1 with a key of 2 is: 20.
The map m1 doesn't have an element with a key of 4.
The element of m1 with a key matching that of the last element is: 30.