/*
equal_range():
返回一个迭代器的pair对象;
第一个表示由lower_bound()返回的iterator
第二个表示由upper_bound()返回的iterator
lower_bound() 和 upper_bound():
lower_bound(k) 查找第一个与键 k 关联的值,
而 upper_bound(k) 是查找第一个键值比 k 大的元素。
如果lower_bound()和upper_bound()查找失败则应该返回这个元素应该插入的位置
ia[]={12,15,17,19,20,22,23,26,29,35,40,51};
如果用21测试, 这两个迭代器都将指向22
如果用22测试 ,lower_bound()返回的迭代器指向22
upper_bound()返回的迭代器指向23
第一个版本的使用 底层的小于号排序
第二个版本使用pred操作
equal_range(first,last,val,pred)
*/
#include<algorithm>
#include<vector>
#include<iterator>
#include<utility>// 引进了pair(arg,arg1)
#include<iostream>
using namespace std;
int main(){
int ia[]={29,23,20,22,17,15,26,51,19,12,35,40};
vector<int>ivec(ia,ia+12);
ostream_iterator<int> ofile(cout," ");
sort(ia,ia+12);
cout<<"array_elem after sort();"<<endl;
copy(ia,ia+12,ofile);
cout<<endl;
pair<int*,int*> ia_iter;
ia_iter=equal_range(ia,ia+12,23);
cout<<"equal_range result of search for value 23 :/n/t"
<<"ia_iter.first: "<<*ia_iter.first<<endl
<<"ia_iter.last: "<<*ia_iter.second<<endl;
ia_iter=equal_range(ia,ia+12,21);
cout<<"equal_range result of search for absent value 21 :/n/t"
<<"ia_iter.first: "<<*ia_iter.first<<endl
<<"ia_iter.last: "<<*ia_iter.second<<endl;
copy(ivec.begin(),ivec.end(),ofile);
cout<<endl
<<"ivec after sort"<<endl;
sort(ivec.begin(),ivec.end(),less<int>());
cout<<"vector elem sequence after sort"<<endl;
copy(ivec.begin(),ivec.end(),ofile);
cout<<endl;
typedef vector<int>::iterator iter_ivec;
pair<iter_ivec,iter_ivec> ivec_iter;
ivec_iter=equal_range(ivec.begin(),ivec.end(),26,less<int>());
cout<<"equal_range result of search for value 26:/n/t"
<<"ivec_iter.first: "<<*ia_iter.first<<endl
<<"ivec_iter.second: "<<*ia_iter.second<<endl;
ivec_iter=equal_range(ivec.begin(),ivec.end(),21,less<int>());
cout<<"equal_range result of search for absent value 21 :/n/t"
<<"ivec_iter.first: "<<*ia_iter.first<<endl
<<"ivec_iter.second: "<<*ia_iter.second<<endl;
system("pause");
return 0;
}
输出:
第一个是 23,26
第二个是22,22
第三个是 22,22
第四个是22,22
根据lower_bound()和upper_bounder的定义
第三个和第四个发生错了。。。
错在什么地方了呢?
equal_range():
返回一个迭代器的pair对象;
第一个表示由lower_bound()返回的iterator
第二个表示由upper_bound()返回的iterator
lower_bound() 和 upper_bound():
lower_bound(k) 查找第一个与键 k 关联的值,
而 upper_bound(k) 是查找第一个键值比 k 大的元素。
如果lower_bound()和upper_bound()查找失败则应该返回这个元素应该插入的位置
ia[]={12,15,17,19,20,22,23,26,29,35,40,51};
如果用21测试, 这两个迭代器都将指向22
如果用22测试 ,lower_bound()返回的迭代器指向22
upper_bound()返回的迭代器指向23
第一个版本的使用 底层的小于号排序
第二个版本使用pred操作
equal_range(first,last,val,pred)
*/
#include<algorithm>
#include<vector>
#include<iterator>
#include<utility>// 引进了pair(arg,arg1)
#include<iostream>
using namespace std;
int main(){
int ia[]={29,23,20,22,17,15,26,51,19,12,35,40};
vector<int>ivec(ia,ia+12);
ostream_iterator<int> ofile(cout," ");
sort(ia,ia+12);
cout<<"array_elem after sort();"<<endl;
copy(ia,ia+12,ofile);
cout<<endl;
pair<int*,int*> ia_iter;
ia_iter=equal_range(ia,ia+12,23);
cout<<"equal_range result of search for value 23 :/n/t"
<<"ia_iter.first: "<<*ia_iter.first<<endl
<<"ia_iter.last: "<<*ia_iter.second<<endl;
ia_iter=equal_range(ia,ia+12,21);
cout<<"equal_range result of search for absent value 21 :/n/t"
<<"ia_iter.first: "<<*ia_iter.first<<endl
<<"ia_iter.last: "<<*ia_iter.second<<endl;
copy(ivec.begin(),ivec.end(),ofile);
cout<<endl
<<"ivec after sort"<<endl;
sort(ivec.begin(),ivec.end(),less<int>());
cout<<"vector elem sequence after sort"<<endl;
copy(ivec.begin(),ivec.end(),ofile);
cout<<endl;
typedef vector<int>::iterator iter_ivec;
pair<iter_ivec,iter_ivec> ivec_iter;
ivec_iter=equal_range(ivec.begin(),ivec.end(),26,less<int>());
cout<<"equal_range result of search for value 26:/n/t"
<<"ivec_iter.first: "<<*ia_iter.first<<endl
<<"ivec_iter.second: "<<*ia_iter.second<<endl;
ivec_iter=equal_range(ivec.begin(),ivec.end(),21,less<int>());
cout<<"equal_range result of search for absent value 21 :/n/t"
<<"ivec_iter.first: "<<*ia_iter.first<<endl
<<"ivec_iter.second: "<<*ia_iter.second<<endl;
system("pause");
return 0;
}
输出:
第一个是 23,26
第二个是22,22
第三个是 22,22
第四个是22,22
根据lower_bound()和upper_bounder的定义
第三个和第四个发生错了。。。
错在什么地方了呢?