48 lines
1.1 KiB
C++
48 lines
1.1 KiB
C++
|
|
//aschoedl@think-cell.com
|
|
|
|
#include <iostream>
|
|
#include <vector>
|
|
|
|
template<typename T, typename IT>
|
|
int binary_search( IT ib, IT ie, const T& e )
|
|
{
|
|
if ( ib == ie || e < *ib || *(ie-1) < e )
|
|
return -1;
|
|
|
|
auto base = ib;
|
|
auto im = (ib+(ie-ib)/2);
|
|
while ( ib != im )
|
|
{
|
|
if ( e < *im )
|
|
ie = im;
|
|
else
|
|
ib = im;
|
|
im = (ib+(ie-ib)/2);
|
|
}
|
|
|
|
return !(*ib < e) ? (ib - base) : -1;
|
|
}
|
|
|
|
void main ( void )
|
|
{
|
|
std::vector<int> v = { 0,1,2,3,4,4,4,4,5,6,7,8,9,11};
|
|
|
|
for ( int i = 0; i < v.size(); i++ ) {
|
|
int j = binary_search( v.begin(), v.end(), v[i] );
|
|
std::cout << v[i] << "->" << j << std::endl;
|
|
}
|
|
std::cout << binary_search( v.begin(), v.end(), 10 ) << std::endl;
|
|
std::cout << binary_search( v.begin(), v.end(), 12 ) << std::endl;
|
|
std::cout << binary_search( v.begin(), v.end(), -4 ) << std::endl;
|
|
|
|
std::vector<int> v0;
|
|
std::cout << binary_search( v0.begin(), v0.end(), 10 ) << std::endl;
|
|
|
|
std::vector<int> v1 = { 1 };
|
|
std::cout << binary_search( v1.begin(), v1.end(), -10 ) << std::endl;
|
|
std::cout << binary_search( v1.begin(), v1.end(), 10 ) << std::endl;
|
|
std::cout << binary_search( v1.begin(), v1.end(), 1 ) << std::endl;
|
|
}
|
|
|