The FBB::binary_search function templates extend the STL binary_search function templates by returning an iterator to the found element, instead of a bool value informing the caller whether or not the searched for element is present in a provided iterator range.
The bool value returned by the STL binary_search function template is often not the kind of information the caller of the function is interested in. Rather, the caller will often want to use binary_search in the way find_if is used: returning an iterator to an element or returning the end-iterator if the element was not found.
Whereas find_if does not require the elements in the iterator range to be sorted, and therefore uses a linear search, binary_search benefits from the sorted nature of the elements using a binary search algorithm requiring 2 log N iterations to locate the searched for element rather than (on average) N/2 iterations. The FBB::binary_search algorithm uses this binary searching process while at the same time allowing it to be used like find_if.
Since the FBB::binary_search function templates use the same number and types of parameters as the stl::binary_search function templates and because they are implemented using the stl::lower_bound algorithms the FBB namespace must explicitly be specified when calling binary_search.
The comparator function is called with two arguments. The first argument refers to an element in the begin..end range, the second argument refers to value.
Usually the types of these arguments are identical, but they may differ. Assuming that Iterator refers to elements of a type Data, then comparison operators bool operator<(Data const &lhs, Type const &rhs) and bool operator<(Type const &rhs, Data const &lhs) must both be available.
#include <iostream> #include <string> #include "../binarysearch" using namespace std; string words[] = { "eight", // alphabetically sorted number-names "five", "four", "nine", "one", "seven", "six", "ten", "three", "two" }; bool compFun(string const &left, string const &right) { return left < right; } int main() { string *ret = FBB::binary_search(words, words + 10, "five"); if (ret != words + 10) cout << "five is at offset " << (ret - words) << endl; ret = FBB::binary_search(words, words + 10, "grandpa"); if (ret == words + 10) cout << "grandpa is not the name of a number\n"; ret = FBB::binary_search(words, words + 10, "five", [&](string const &element, string const &value) { return element < value; } ); if (ret != words + 10) cout << "five is at offset " << (ret - words) << endl; ret = FBB::binary_search(words, words + 10, "grandpa", compFun); // or use: Comparator() if (ret == words + 10) cout << "grandpa is not the name of a number\n"; }
and an example showing the use of different types:
#include <iostream> #include <string> #include "../binarysearch" using namespace std; struct Words { string str; int value; }; bool operator<(Words const &word, string const &str) { return word.str < str; } bool operator<(string const &str, Words const &word) { return str < word.str; } Words words[] = { { "eight", 0 }, // alphabetically sorted number-names { "five", 0 }, { "four", 0 }, { "nine", 0 }, { "one", 0 }, { "seven", 0 }, { "six", 0 }, { "ten", 0 }, { "three", 0 }, { "two", 0 } }; int main() { auto ret = FBB::binary_search(words, words + 10, "five", [&](Words const &element, string const &value) { return element < value; } ); cout << (ret != words + 10 ? "found it" : "not present") << '\n'; }