FBB::binary_search(3bobcat) | Binary search function | FBB::binary_search(3bobcat) |
FBB::binary_search - Extensions to the STL binary_search function template
#include <bobcat/binarysearch>
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.
FBB
All constructors, members, operators and manipulators, mentioned in this
man-page, are defined in the namespace FBB.
-
In the following description several template type parameters are used. They are:
#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’; }
bobcat/binarysearch - defines the template functions
bobcat(7)
None reported.
Bobcat is an acronym of `Brokken’s Own Base Classes And Templates’.
This is free software, distributed under the terms of the GNU General Public License (GPL).
Frank B. Brokken (f.b.brokken@rug.nl).
2005-2023 | libbobcat-dev_6.04.00 |