/* * Copyright 2008-2012 NVIDIA Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /*! \file binary_search.h * \brief Search for values in sorted ranges. */ #pragma once #include #include #include namespace thrust { /*! \addtogroup algorithms */ /*! \addtogroup searching * \ingroup algorithms * \{ */ /*! \addtogroup binary_search Binary Search * \ingroup searching * \{ */ ////////////////////// // Scalar Functions // ////////////////////// /*! \p lower_bound is a version of binary search: it attempts to find * the element value in an ordered range [first, last). * Specifically, it returns the first position where value could be * inserted without violating the ordering. This version of * \p lower_bound uses operator< for comparison and returns * the furthermost iterator \c i in [first, last) such that, * for every iterator \c j in [first, i), *j < value. * * The algorithm's execution is parallelized as determined by \p exec. * * \param exec The execution policy to use for parallelization. * \param first The beginning of the ordered sequence. * \param last The end of the ordered sequence. * \param value The value to be searched. * \return The furthermost iterator \c i, such that *i < value. * * \tparam DerivedPolicy The name of the derived execution policy. * \tparam ForwardIterator is a model of Forward Iterator. * \tparam LessThanComparable is a model of LessThanComparable. * * The following code snippet demonstrates how to use \p lower_bound * to search for values in a ordered range using the \p thrust::device execution policy for parallelization: * * \code * #include * #include * #include * ... * thrust::device_vector input(5); * * input[0] = 0; * input[1] = 2; * input[2] = 5; * input[3] = 7; * input[4] = 8; * * thrust::lower_bound(thrust::device, input.begin(), input.end(), 0); // returns input.begin() * thrust::lower_bound(thrust::device, input.begin(), input.end(), 1); // returns input.begin() + 1 * thrust::lower_bound(thrust::device, input.begin(), input.end(), 2); // returns input.begin() + 1 * thrust::lower_bound(thrust::device, input.begin(), input.end(), 3); // returns input.begin() + 2 * thrust::lower_bound(thrust::device, input.begin(), input.end(), 8); // returns input.begin() + 4 * thrust::lower_bound(thrust::device, input.begin(), input.end(), 9); // returns input.end() * \endcode * * \see http://www.sgi.com/tech/stl/lower_bound.html * \see \p upper_bound * \see \p equal_range * \see \p binary_search */ template ForwardIterator lower_bound(const thrust::detail::execution_policy_base &exec, ForwardIterator first, ForwardIterator last, const LessThanComparable &value); /*! \p lower_bound is a version of binary search: it attempts to find * the element value in an ordered range [first, last). * Specifically, it returns the first position where value could be * inserted without violating the ordering. This version of * \p lower_bound uses operator< for comparison and returns * the furthermost iterator \c i in [first, last) such that, * for every iterator \c j in [first, i), *j < value. * * \param first The beginning of the ordered sequence. * \param last The end of the ordered sequence. * \param value The value to be searched. * \return The furthermost iterator \c i, such that *i < value. * * \tparam ForwardIterator is a model of Forward Iterator. * \tparam LessThanComparable is a model of LessThanComparable. * * The following code snippet demonstrates how to use \p lower_bound * to search for values in a ordered range. * * \code * #include * #include * ... * thrust::device_vector input(5); * * input[0] = 0; * input[1] = 2; * input[2] = 5; * input[3] = 7; * input[4] = 8; * * thrust::lower_bound(input.begin(), input.end(), 0); // returns input.begin() * thrust::lower_bound(input.begin(), input.end(), 1); // returns input.begin() + 1 * thrust::lower_bound(input.begin(), input.end(), 2); // returns input.begin() + 1 * thrust::lower_bound(input.begin(), input.end(), 3); // returns input.begin() + 2 * thrust::lower_bound(input.begin(), input.end(), 8); // returns input.begin() + 4 * thrust::lower_bound(input.begin(), input.end(), 9); // returns input.end() * \endcode * * \see http://www.sgi.com/tech/stl/lower_bound.html * \see \p upper_bound * \see \p equal_range * \see \p binary_search */ template ForwardIterator lower_bound(ForwardIterator first, ForwardIterator last, const LessThanComparable& value); /*! \p lower_bound is a version of binary search: it attempts to find * the element value in an ordered range [first, last). * Specifically, it returns the first position where value could be * inserted without violating the ordering. This version of * \p lower_bound uses function object \c comp for comparison * and returns the furthermost iterator \c i in [first, last) * such that, for every iterator \c j in [first, i), * comp(*j, value) is \c true. * * The algorithm's execution is parallelized as determined by \p exec. * * \param exec The execution policy to use for parallelization. * \param first The beginning of the ordered sequence. * \param last The end of the ordered sequence. * \param value The value to be searched. * \param comp The comparison operator. * \return The furthermost iterator \c i, such that comp(*i, value) is \c true. * * \tparam DerivedPolicy The name of the derived execution policy. * \tparam ForwardIterator is a model of Forward Iterator. * \tparam T is comparable to \p ForwardIterator's \c value_type. * \tparam StrictWeakOrdering is a model of Strict Weak Ordering. * * The following code snippet demonstrates how to use \p lower_bound * to search for values in a ordered range using the \p thrust::device execution policy for parallelization: * * \code * #include * #include * #include * #include * ... * thrust::device_vector input(5); * * input[0] = 0; * input[1] = 2; * input[2] = 5; * input[3] = 7; * input[4] = 8; * * thrust::lower_bound(input.begin(), input.end(), 0, thrust::less()); // returns input.begin() * thrust::lower_bound(input.begin(), input.end(), 1, thrust::less()); // returns input.begin() + 1 * thrust::lower_bound(input.begin(), input.end(), 2, thrust::less()); // returns input.begin() + 1 * thrust::lower_bound(input.begin(), input.end(), 3, thrust::less()); // returns input.begin() + 2 * thrust::lower_bound(input.begin(), input.end(), 8, thrust::less()); // returns input.begin() + 4 * thrust::lower_bound(input.begin(), input.end(), 9, thrust::less()); // returns input.end() * \endcode * * \see http://www.sgi.com/tech/stl/lower_bound.html * \see \p upper_bound * \see \p equal_range * \see \p binary_search */ template ForwardIterator lower_bound(const thrust::detail::execution_policy_base &exec, ForwardIterator first, ForwardIterator last, const T &value, StrictWeakOrdering comp); /*! \p lower_bound is a version of binary search: it attempts to find * the element value in an ordered range [first, last). * Specifically, it returns the first position where value could be * inserted without violating the ordering. This version of * \p lower_bound uses function object \c comp for comparison * and returns the furthermost iterator \c i in [first, last) * such that, for every iterator \c j in [first, i), * comp(*j, value) is \c true. * * \param first The beginning of the ordered sequence. * \param last The end of the ordered sequence. * \param value The value to be searched. * \param comp The comparison operator. * \return The furthermost iterator \c i, such that comp(*i, value) is \c true. * * \tparam ForwardIterator is a model of Forward Iterator. * \tparam T is comparable to \p ForwardIterator's \c value_type. * \tparam StrictWeakOrdering is a model of Strict Weak Ordering. * * The following code snippet demonstrates how to use \p lower_bound * to search for values in a ordered range. * * \code * #include * #include * #include * ... * thrust::device_vector input(5); * * input[0] = 0; * input[1] = 2; * input[2] = 5; * input[3] = 7; * input[4] = 8; * * thrust::lower_bound(input.begin(), input.end(), 0, thrust::less()); // returns input.begin() * thrust::lower_bound(input.begin(), input.end(), 1, thrust::less()); // returns input.begin() + 1 * thrust::lower_bound(input.begin(), input.end(), 2, thrust::less()); // returns input.begin() + 1 * thrust::lower_bound(input.begin(), input.end(), 3, thrust::less()); // returns input.begin() + 2 * thrust::lower_bound(input.begin(), input.end(), 8, thrust::less()); // returns input.begin() + 4 * thrust::lower_bound(input.begin(), input.end(), 9, thrust::less()); // returns input.end() * \endcode * * \see http://www.sgi.com/tech/stl/lower_bound.html * \see \p upper_bound * \see \p equal_range * \see \p binary_search */ template ForwardIterator lower_bound(ForwardIterator first, ForwardIterator last, const T& value, StrictWeakOrdering comp); /*! \p upper_bound is a version of binary search: it attempts to find * the element value in an ordered range [first, last). * Specifically, it returns the last position where value could be * inserted without violating the ordering. This version of * \p upper_bound uses operator< for comparison and returns * the furthermost iterator \c i in [first, last) such that, * for every iterator \c j in [first, i), value < *j * is \c false. * * The algorithm's execution is parallelized as determined by \p exec. * * \param exec The execution policy to use for parallelization. * \param first The beginning of the ordered sequence. * \param last The end of the ordered sequence. * \param value The value to be searched. * \return The furthermost iterator \c i, such that value < *i is \c false. * * \tparam DerivedPolicy The name of the derived execution policy. * \tparam ForwardIterator is a model of Forward Iterator. * \tparam LessThanComparable is a model of LessThanComparable. * * The following code snippet demonstrates how to use \p upper_bound * to search for values in a ordered range using the \p thrust::device execution policy for parallelism: * * \code * #include * #include * #include * ... * thrust::device_vector input(5); * * input[0] = 0; * input[1] = 2; * input[2] = 5; * input[3] = 7; * input[4] = 8; * * thrust::upper_bound(thrust::device, input.begin(), input.end(), 0); // returns input.begin() + 1 * thrust::upper_bound(thrust::device, input.begin(), input.end(), 1); // returns input.begin() + 1 * thrust::upper_bound(thrust::device, input.begin(), input.end(), 2); // returns input.begin() + 2 * thrust::upper_bound(thrust::device, input.begin(), input.end(), 3); // returns input.begin() + 2 * thrust::upper_bound(thrust::device, input.begin(), input.end(), 8); // returns input.end() * thrust::upper_bound(thrust::device, input.begin(), input.end(), 9); // returns input.end() * \endcode * * \see http://www.sgi.com/tech/stl/upper_bound.html * \see \p lower_bound * \see \p equal_range * \see \p binary_search */ template ForwardIterator upper_bound(const thrust::detail::execution_policy_base &exec, ForwardIterator first, ForwardIterator last, const LessThanComparable &value); /*! \p upper_bound is a version of binary search: it attempts to find * the element value in an ordered range [first, last). * Specifically, it returns the last position where value could be * inserted without violating the ordering. This version of * \p upper_bound uses operator< for comparison and returns * the furthermost iterator \c i in [first, last) such that, * for every iterator \c j in [first, i), value < *j * is \c false. * * \param first The beginning of the ordered sequence. * \param last The end of the ordered sequence. * \param value The value to be searched. * \return The furthermost iterator \c i, such that value < *i is \c false. * * \tparam ForwardIterator is a model of Forward Iterator. * \tparam LessThanComparable is a model of LessThanComparable. * * The following code snippet demonstrates how to use \p upper_bound * to search for values in a ordered range. * * \code * #include * #include * ... * thrust::device_vector input(5); * * input[0] = 0; * input[1] = 2; * input[2] = 5; * input[3] = 7; * input[4] = 8; * * thrust::upper_bound(input.begin(), input.end(), 0); // returns input.begin() + 1 * thrust::upper_bound(input.begin(), input.end(), 1); // returns input.begin() + 1 * thrust::upper_bound(input.begin(), input.end(), 2); // returns input.begin() + 2 * thrust::upper_bound(input.begin(), input.end(), 3); // returns input.begin() + 2 * thrust::upper_bound(input.begin(), input.end(), 8); // returns input.end() * thrust::upper_bound(input.begin(), input.end(), 9); // returns input.end() * \endcode * * \see http://www.sgi.com/tech/stl/upper_bound.html * \see \p lower_bound * \see \p equal_range * \see \p binary_search */ template ForwardIterator upper_bound(ForwardIterator first, ForwardIterator last, const LessThanComparable& value); /*! \p upper_bound is a version of binary search: it attempts to find * the element value in an ordered range [first, last). * Specifically, it returns the last position where value could be * inserted without violating the ordering. This version of * \p upper_bound uses function object \c comp for comparison and returns * the furthermost iterator \c i in [first, last) such that, * for every iterator \c j in [first, i), comp(value, *j) * is \c false. * * The algorithm's execution is parallelized as determined by \p exec. * * \param exec The execution policy to use for parallelization. * \param first The beginning of the ordered sequence. * \param last The end of the ordered sequence. * \param value The value to be searched. * \param comp The comparison operator. * \return The furthermost iterator \c i, such that comp(value, *i) is \c false. * * \tparam DerivedPolicy The name of the derived execution policy. * \tparam ForwardIterator is a model of Forward Iterator. * \tparam T is comparable to \p ForwardIterator's \c value_type. * \tparam StrictWeakOrdering is a model of Strict Weak Ordering. * * The following code snippet demonstrates how to use \p upper_bound * to search for values in a ordered range using the \p thrust::device execution policy for parallelization: * * \code * #include * #include * #include * #include * ... * thrust::device_vector input(5); * * input[0] = 0; * input[1] = 2; * input[2] = 5; * input[3] = 7; * input[4] = 8; * * thrust::upper_bound(thrust::device, input.begin(), input.end(), 0, thrust::less()); // returns input.begin() + 1 * thrust::upper_bound(thrust::device, input.begin(), input.end(), 1, thrust::less()); // returns input.begin() + 1 * thrust::upper_bound(thrust::device, input.begin(), input.end(), 2, thrust::less()); // returns input.begin() + 2 * thrust::upper_bound(thrust::device, input.begin(), input.end(), 3, thrust::less()); // returns input.begin() + 2 * thrust::upper_bound(thrust::device, input.begin(), input.end(), 8, thrust::less()); // returns input.end() * thrust::upper_bound(thrust::device, input.begin(), input.end(), 9, thrust::less()); // returns input.end() * \endcode * * \see http://www.sgi.com/tech/stl/upper_bound.html * \see \p lower_bound * \see \p equal_range * \see \p binary_search */ template ForwardIterator upper_bound(const thrust::detail::execution_policy_base &exec, ForwardIterator first, ForwardIterator last, const T &value, StrictWeakOrdering comp); /*! \p upper_bound is a version of binary search: it attempts to find * the element value in an ordered range [first, last). * Specifically, it returns the last position where value could be * inserted without violating the ordering. This version of * \p upper_bound uses function object \c comp for comparison and returns * the furthermost iterator \c i in [first, last) such that, * for every iterator \c j in [first, i), comp(value, *j) * is \c false. * * \param first The beginning of the ordered sequence. * \param last The end of the ordered sequence. * \param value The value to be searched. * \param comp The comparison operator. * \return The furthermost iterator \c i, such that comp(value, *i) is \c false. * * \tparam ForwardIterator is a model of Forward Iterator. * \tparam T is comparable to \p ForwardIterator's \c value_type. * \tparam StrictWeakOrdering is a model of Strict Weak Ordering. * * The following code snippet demonstrates how to use \p upper_bound * to search for values in a ordered range. * * \code * #include * #include * #include * ... * thrust::device_vector input(5); * * input[0] = 0; * input[1] = 2; * input[2] = 5; * input[3] = 7; * input[4] = 8; * * thrust::upper_bound(input.begin(), input.end(), 0, thrust::less()); // returns input.begin() + 1 * thrust::upper_bound(input.begin(), input.end(), 1, thrust::less()); // returns input.begin() + 1 * thrust::upper_bound(input.begin(), input.end(), 2, thrust::less()); // returns input.begin() + 2 * thrust::upper_bound(input.begin(), input.end(), 3, thrust::less()); // returns input.begin() + 2 * thrust::upper_bound(input.begin(), input.end(), 8, thrust::less()); // returns input.end() * thrust::upper_bound(input.begin(), input.end(), 9, thrust::less()); // returns input.end() * \endcode * * \see http://www.sgi.com/tech/stl/upper_bound.html * \see \p lower_bound * \see \p equal_range * \see \p binary_search */ template ForwardIterator upper_bound(ForwardIterator first, ForwardIterator last, const T& value, StrictWeakOrdering comp); /*! \p binary_search is a version of binary search: it attempts to find * the element value in an ordered range [first, last). * It returns \c true if an element that is equivalent to \c value * is present in [first, last) and \c false if no such element * exists. Specifically, this version returns \c true if and only if * there exists an iterator \c i in [first, last) such that * *i < value and value < *i are both \c false. * * The algorithm's execution is parallelized as determined by \p exec. * * \param exec The execution policy to use for parallelization. * \param first The beginning of the ordered sequence. * \param last The end of the ordered sequence. * \param value The value to be searched. * \return \c true if an equivalent element exists in [first, last), otherwise \c false. * * \tparam DerivedPolicy The name of the derived execution policy. * \tparam ForwardIterator is a model of Forward Iterator. * \tparam LessThanComparable is a model of LessThanComparable. * * The following code snippet demonstrates how to use \p binary_search * to search for values in a ordered range using the \p thrust::device execution policy for parallelization: * * \code * #include * #include * #include * ... * thrust::device_vector input(5); * * input[0] = 0; * input[1] = 2; * input[2] = 5; * input[3] = 7; * input[4] = 8; * * thrust::binary_search(thrust::device, input.begin(), input.end(), 0); // returns true * thrust::binary_search(thrust::device, input.begin(), input.end(), 1); // returns false * thrust::binary_search(thrust::device, input.begin(), input.end(), 2); // returns true * thrust::binary_search(thrust::device, input.begin(), input.end(), 3); // returns false * thrust::binary_search(thrust::device, input.begin(), input.end(), 8); // returns true * thrust::binary_search(thrust::device, input.begin(), input.end(), 9); // returns false * \endcode * * \see http://www.sgi.com/tech/stl/binary_search.html * \see \p lower_bound * \see \p upper_bound * \see \p equal_range */ template bool binary_search(const thrust::detail::execution_policy_base &exec, ForwardIterator first, ForwardIterator last, const LessThanComparable& value); /*! \p binary_search is a version of binary search: it attempts to find * the element value in an ordered range [first, last). * It returns \c true if an element that is equivalent to \c value * is present in [first, last) and \c false if no such element * exists. Specifically, this version returns \c true if and only if * there exists an iterator \c i in [first, last) such that * *i < value and value < *i are both \c false. * * \param first The beginning of the ordered sequence. * \param last The end of the ordered sequence. * \param value The value to be searched. * \return \c true if an equivalent element exists in [first, last), otherwise \c false. * * \tparam ForwardIterator is a model of Forward Iterator. * \tparam LessThanComparable is a model of LessThanComparable. * * The following code snippet demonstrates how to use \p binary_search * to search for values in a ordered range. * * \code * #include * #include * ... * thrust::device_vector input(5); * * input[0] = 0; * input[1] = 2; * input[2] = 5; * input[3] = 7; * input[4] = 8; * * thrust::binary_search(input.begin(), input.end(), 0); // returns true * thrust::binary_search(input.begin(), input.end(), 1); // returns false * thrust::binary_search(input.begin(), input.end(), 2); // returns true * thrust::binary_search(input.begin(), input.end(), 3); // returns false * thrust::binary_search(input.begin(), input.end(), 8); // returns true * thrust::binary_search(input.begin(), input.end(), 9); // returns false * \endcode * * \see http://www.sgi.com/tech/stl/binary_search.html * \see \p lower_bound * \see \p upper_bound * \see \p equal_range */ template bool binary_search(ForwardIterator first, ForwardIterator last, const LessThanComparable& value); /*! \p binary_search is a version of binary search: it attempts to find * the element value in an ordered range [first, last). * It returns \c true if an element that is equivalent to \c value * is present in [first, last) and \c false if no such element * exists. Specifically, this version returns \c true if and only if * there exists an iterator \c i in [first, last) such that * comp(*i, value) and comp(value, *i) are both \c false. * * The algorithm's execution is parallelized as determined by \p exec. * * \param exec The execution policy to use for parallelization. * \param first The beginning of the ordered sequence. * \param last The end of the ordered sequence. * \param value The value to be searched. * \param comp The comparison operator. * \return \c true if an equivalent element exists in [first, last), otherwise \c false. * * \tparam DerivedPolicy The name of the derived execution policy. * \tparam ForwardIterator is a model of Forward Iterator. * \tparam T is comparable to \p ForwardIterator's \c value_type. * \tparam StrictWeakOrdering is a model of Strict Weak Ordering. * * The following code snippet demonstrates how to use \p binary_search * to search for values in a ordered range using the \p thrust::device execution policy for parallelization: * * \code * #include * #include * #include * #include * ... * thrust::device_vector input(5); * * input[0] = 0; * input[1] = 2; * input[2] = 5; * input[3] = 7; * input[4] = 8; * * thrust::binary_search(thrust::device, input.begin(), input.end(), 0, thrust::less()); // returns true * thrust::binary_search(thrust::device, input.begin(), input.end(), 1, thrust::less()); // returns false * thrust::binary_search(thrust::device, input.begin(), input.end(), 2, thrust::less()); // returns true * thrust::binary_search(thrust::device, input.begin(), input.end(), 3, thrust::less()); // returns false * thrust::binary_search(thrust::device, input.begin(), input.end(), 8, thrust::less()); // returns true * thrust::binary_search(thrust::device, input.begin(), input.end(), 9, thrust::less()); // returns false * \endcode * * \see http://www.sgi.com/tech/stl/binary_search.html * \see \p lower_bound * \see \p upper_bound * \see \p equal_range */ template bool binary_search(const thrust::detail::execution_policy_base &exec, ForwardIterator first, ForwardIterator last, const T& value, StrictWeakOrdering comp); /*! \p binary_search is a version of binary search: it attempts to find * the element value in an ordered range [first, last). * It returns \c true if an element that is equivalent to \c value * is present in [first, last) and \c false if no such element * exists. Specifically, this version returns \c true if and only if * there exists an iterator \c i in [first, last) such that * comp(*i, value) and comp(value, *i) are both \c false. * * \param first The beginning of the ordered sequence. * \param last The end of the ordered sequence. * \param value The value to be searched. * \param comp The comparison operator. * \return \c true if an equivalent element exists in [first, last), otherwise \c false. * * \tparam ForwardIterator is a model of Forward Iterator. * \tparam T is comparable to \p ForwardIterator's \c value_type. * \tparam StrictWeakOrdering is a model of Strict Weak Ordering. * * The following code snippet demonstrates how to use \p binary_search * to search for values in a ordered range. * * \code * #include * #include * #include * ... * thrust::device_vector input(5); * * input[0] = 0; * input[1] = 2; * input[2] = 5; * input[3] = 7; * input[4] = 8; * * thrust::binary_search(input.begin(), input.end(), 0, thrust::less()); // returns true * thrust::binary_search(input.begin(), input.end(), 1, thrust::less()); // returns false * thrust::binary_search(input.begin(), input.end(), 2, thrust::less()); // returns true * thrust::binary_search(input.begin(), input.end(), 3, thrust::less()); // returns false * thrust::binary_search(input.begin(), input.end(), 8, thrust::less()); // returns true * thrust::binary_search(input.begin(), input.end(), 9, thrust::less()); // returns false * \endcode * * \see http://www.sgi.com/tech/stl/binary_search.html * \see \p lower_bound * \see \p upper_bound * \see \p equal_range */ template bool binary_search(ForwardIterator first, ForwardIterator last, const T& value, StrictWeakOrdering comp); /*! \p equal_range is a version of binary search: it attempts to find * the element value in an ordered range [first, last). The * value returned by \p equal_range is essentially a combination of * the values returned by \p lower_bound and \p upper_bound: it returns * a \p pair of iterators \c i and \c j such that \c i is the first * position where value could be inserted without violating the * ordering and \c j is the last position where value could be inserted * without violating the ordering. It follows that every element in the * range [i, j) is equivalent to value, and that * [i, j) is the largest subrange of [first, last) that * has this property. * * This version of \p equal_range returns a \p pair of iterators * [i, j), where \c i is the furthermost iterator in * [first, last) such that, for every iterator \c k in * [first, i), *k < value. \c j is the furthermost * iterator in [first, last) such that, for every iterator * \c k in [first, j), value < *k is \c false. * For every iterator \c k in [i, j), neither * value < *k nor *k < value is \c true. * * The algorithm's execution is parallelized as determined by \p exec. * * \param exec The execution policy to use for parallelization. * \param first The beginning of the ordered sequence. * \param last The end of the ordered sequence. * \param value The value to be searched. * \return A \p pair of iterators [i, j) that define the range of equivalent elements. * * \tparam DerivedPolicy The name of the derived execution policy. * \tparam ForwardIterator is a model of Forward Iterator. * \tparam LessThanComparable is a model of LessThanComparable. * * The following code snippet demonstrates how to use \p equal_range * to search for values in a ordered range using the \p thrust::device execution policy for parallelization: * * \code * #include * #include * #include * ... * thrust::device_vector input(5); * * input[0] = 0; * input[1] = 2; * input[2] = 5; * input[3] = 7; * input[4] = 8; * * thrust::equal_range(thrust::device, input.begin(), input.end(), 0); // returns [input.begin(), input.begin() + 1) * thrust::equal_range(thrust::device, input.begin(), input.end(), 1); // returns [input.begin() + 1, input.begin() + 1) * thrust::equal_range(thrust::device, input.begin(), input.end(), 2); // returns [input.begin() + 1, input.begin() + 2) * thrust::equal_range(thrust::device, input.begin(), input.end(), 3); // returns [input.begin() + 2, input.begin() + 2) * thrust::equal_range(thrust::device, input.begin(), input.end(), 8); // returns [input.begin() + 4, input.end) * thrust::equal_range(thrust::device, input.begin(), input.end(), 9); // returns [input.end(), input.end) * \endcode * * \see http://www.sgi.com/tech/stl/equal_range.html * \see \p lower_bound * \see \p upper_bound * \see \p binary_search */ template thrust::pair equal_range(const thrust::detail::execution_policy_base &exec, ForwardIterator first, ForwardIterator last, const LessThanComparable& value); /*! \p equal_range is a version of binary search: it attempts to find * the element value in an ordered range [first, last). The * value returned by \p equal_range is essentially a combination of * the values returned by \p lower_bound and \p upper_bound: it returns * a \p pair of iterators \c i and \c j such that \c i is the first * position where value could be inserted without violating the * ordering and \c j is the last position where value could be inserted * without violating the ordering. It follows that every element in the * range [i, j) is equivalent to value, and that * [i, j) is the largest subrange of [first, last) that * has this property. * * This version of \p equal_range returns a \p pair of iterators * [i, j), where \c i is the furthermost iterator in * [first, last) such that, for every iterator \c k in * [first, i), *k < value. \c j is the furthermost * iterator in [first, last) such that, for every iterator * \c k in [first, j), value < *k is \c false. * For every iterator \c k in [i, j), neither * value < *k nor *k < value is \c true. * * \param first The beginning of the ordered sequence. * \param last The end of the ordered sequence. * \param value The value to be searched. * \return A \p pair of iterators [i, j) that define the range of equivalent elements. * * \tparam ForwardIterator is a model of Forward Iterator. * \tparam LessThanComparable is a model of LessThanComparable. * * The following code snippet demonstrates how to use \p equal_range * to search for values in a ordered range. * * \code * #include * #include * ... * thrust::device_vector input(5); * * input[0] = 0; * input[1] = 2; * input[2] = 5; * input[3] = 7; * input[4] = 8; * * thrust::equal_range(input.begin(), input.end(), 0); // returns [input.begin(), input.begin() + 1) * thrust::equal_range(input.begin(), input.end(), 1); // returns [input.begin() + 1, input.begin() + 1) * thrust::equal_range(input.begin(), input.end(), 2); // returns [input.begin() + 1, input.begin() + 2) * thrust::equal_range(input.begin(), input.end(), 3); // returns [input.begin() + 2, input.begin() + 2) * thrust::equal_range(input.begin(), input.end(), 8); // returns [input.begin() + 4, input.end) * thrust::equal_range(input.begin(), input.end(), 9); // returns [input.end(), input.end) * \endcode * * \see http://www.sgi.com/tech/stl/equal_range.html * \see \p lower_bound * \see \p upper_bound * \see \p binary_search */ template thrust::pair equal_range(ForwardIterator first, ForwardIterator last, const LessThanComparable& value); /*! \p equal_range is a version of binary search: it attempts to find * the element value in an ordered range [first, last). The * value returned by \p equal_range is essentially a combination of * the values returned by \p lower_bound and \p upper_bound: it returns * a \p pair of iterators \c i and \c j such that \c i is the first * position where value could be inserted without violating the * ordering and \c j is the last position where value could be inserted * without violating the ordering. It follows that every element in the * range [i, j) is equivalent to value, and that * [i, j) is the largest subrange of [first, last) that * has this property. * * This version of \p equal_range returns a \p pair of iterators * [i, j). \c i is the furthermost iterator in * [first, last) such that, for every iterator \c k in * [first, i), comp(*k, value) is \c true. * \c j is the furthermost iterator in [first, last) such * that, for every iterator \c k in [first, last), * comp(value, *k) is \c false. For every iterator \c k * in [i, j), neither comp(value, *k) nor * comp(*k, value) is \c true. * * The algorithm's execution is parallelized as determined by \p exec. * * \param exec The execution policy to use for parallelization. * \param first The beginning of the ordered sequence. * \param last The end of the ordered sequence. * \param value The value to be searched. * \param comp The comparison operator. * \return A \p pair of iterators [i, j) that define the range of equivalent elements. * * \tparam DerivedPolicy The name of the derived execution policy. * \tparam ForwardIterator is a model of Forward Iterator. * \tparam T is comparable to \p ForwardIterator's \c value_type. * \tparam StrictWeakOrdering is a model of Strict Weak Ordering. * * The following code snippet demonstrates how to use \p equal_range * to search for values in a ordered range using the \p thrust::device execution policy for parallelization: * * \code * #include * #include * #include * #include * ... * thrust::device_vector input(5); * * input[0] = 0; * input[1] = 2; * input[2] = 5; * input[3] = 7; * input[4] = 8; * * thrust::equal_range(thrust::device, input.begin(), input.end(), 0, thrust::less()); // returns [input.begin(), input.begin() + 1) * thrust::equal_range(thrust::device, input.begin(), input.end(), 1, thrust::less()); // returns [input.begin() + 1, input.begin() + 1) * thrust::equal_range(thrust::device, input.begin(), input.end(), 2, thrust::less()); // returns [input.begin() + 1, input.begin() + 2) * thrust::equal_range(thrust::device, input.begin(), input.end(), 3, thrust::less()); // returns [input.begin() + 2, input.begin() + 2) * thrust::equal_range(thrust::device, input.begin(), input.end(), 8, thrust::less()); // returns [input.begin() + 4, input.end) * thrust::equal_range(thrust::device, input.begin(), input.end(), 9, thrust::less()); // returns [input.end(), input.end) * \endcode * * \see http://www.sgi.com/tech/stl/equal_range.html * \see \p lower_bound * \see \p upper_bound * \see \p binary_search */ template thrust::pair equal_range(const thrust::detail::execution_policy_base &exec, ForwardIterator first, ForwardIterator last, const T& value, StrictWeakOrdering comp); /*! \p equal_range is a version of binary search: it attempts to find * the element value in an ordered range [first, last). The * value returned by \p equal_range is essentially a combination of * the values returned by \p lower_bound and \p upper_bound: it returns * a \p pair of iterators \c i and \c j such that \c i is the first * position where value could be inserted without violating the * ordering and \c j is the last position where value could be inserted * without violating the ordering. It follows that every element in the * range [i, j) is equivalent to value, and that * [i, j) is the largest subrange of [first, last) that * has this property. * * This version of \p equal_range returns a \p pair of iterators * [i, j). \c i is the furthermost iterator in * [first, last) such that, for every iterator \c k in * [first, i), comp(*k, value) is \c true. * \c j is the furthermost iterator in [first, last) such * that, for every iterator \c k in [first, last), * comp(value, *k) is \c false. For every iterator \c k * in [i, j), neither comp(value, *k) nor * comp(*k, value) is \c true. * * \param first The beginning of the ordered sequence. * \param last The end of the ordered sequence. * \param value The value to be searched. * \param comp The comparison operator. * \return A \p pair of iterators [i, j) that define the range of equivalent elements. * * \tparam ForwardIterator is a model of Forward Iterator. * \tparam T is comparable to \p ForwardIterator's \c value_type. * \tparam StrictWeakOrdering is a model of Strict Weak Ordering. * * The following code snippet demonstrates how to use \p equal_range * to search for values in a ordered range. * * \code * #include * #include * #include * ... * thrust::device_vector input(5); * * input[0] = 0; * input[1] = 2; * input[2] = 5; * input[3] = 7; * input[4] = 8; * * thrust::equal_range(input.begin(), input.end(), 0, thrust::less()); // returns [input.begin(), input.begin() + 1) * thrust::equal_range(input.begin(), input.end(), 1, thrust::less()); // returns [input.begin() + 1, input.begin() + 1) * thrust::equal_range(input.begin(), input.end(), 2, thrust::less()); // returns [input.begin() + 1, input.begin() + 2) * thrust::equal_range(input.begin(), input.end(), 3, thrust::less()); // returns [input.begin() + 2, input.begin() + 2) * thrust::equal_range(input.begin(), input.end(), 8, thrust::less()); // returns [input.begin() + 4, input.end) * thrust::equal_range(input.begin(), input.end(), 9, thrust::less()); // returns [input.end(), input.end) * \endcode * * \see http://www.sgi.com/tech/stl/equal_range.html * \see \p lower_bound * \see \p upper_bound * \see \p binary_search */ template thrust::pair equal_range(ForwardIterator first, ForwardIterator last, const T& value, StrictWeakOrdering comp); /*! \addtogroup vectorized_binary_search Vectorized Searches * \ingroup binary_search * \{ */ ////////////////////// // Vector Functions // ////////////////////// /*! \p lower_bound is a vectorized version of binary search: for each * iterator \c v in [values_first, values_last) it attempts to * find the value *v in an ordered range [first, last). * Specifically, it returns the index of first position where value could * be inserted without violating the ordering. * * The algorithm's execution is parallelized as determined by \p exec. * * \param exec The execution policy to use for parallelization. * \param first The beginning of the ordered sequence. * \param last The end of the ordered sequence. * \param values_first The beginning of the search values sequence. * \param values_last The end of the search values sequence. * \param result The beginning of the output sequence. * * \tparam DerivedPolicy The name of the derived execution policy. * \tparam ForwardIterator is a model of Forward Iterator. * \tparam InputIterator is a model of Input Iterator. * and \c InputIterator's \c value_type is LessThanComparable. * \tparam OutputIterator is a model of Output Iterator. * and \c ForwardIterator's difference_type is convertible to \c OutputIterator's \c value_type. * * \pre The ranges [first,last) and [result, result + (last - first)) shall not overlap. * * The following code snippet demonstrates how to use \p lower_bound * to search for multiple values in a ordered range using the \p thrust::device execution policy for * parallelization: * * \code * #include * #include * #include * ... * thrust::device_vector input(5); * * input[0] = 0; * input[1] = 2; * input[2] = 5; * input[3] = 7; * input[4] = 8; * * thrust::device_vector values(6); * values[0] = 0; * values[1] = 1; * values[2] = 2; * values[3] = 3; * values[4] = 8; * values[5] = 9; * * thrust::device_vector output(6); * * thrust::lower_bound(thrust::device, * input.begin(), input.end(), * values.begin(), values.end(), * output.begin()); * * // output is now [0, 1, 1, 2, 4, 5] * \endcode * * \see http://www.sgi.com/tech/stl/lower_bound.html * \see \p upper_bound * \see \p equal_range * \see \p binary_search */ template OutputIterator lower_bound(const thrust::detail::execution_policy_base &exec, ForwardIterator first, ForwardIterator last, InputIterator values_first, InputIterator values_last, OutputIterator result); /*! \p lower_bound is a vectorized version of binary search: for each * iterator \c v in [values_first, values_last) it attempts to * find the value *v in an ordered range [first, last). * Specifically, it returns the index of first position where value could * be inserted without violating the ordering. * * \param first The beginning of the ordered sequence. * \param last The end of the ordered sequence. * \param values_first The beginning of the search values sequence. * \param values_last The end of the search values sequence. * \param result The beginning of the output sequence. * * \tparam ForwardIterator is a model of Forward Iterator. * \tparam InputIterator is a model of Input Iterator. * and \c InputIterator's \c value_type is LessThanComparable. * \tparam OutputIterator is a model of Output Iterator. * and \c ForwardIterator's difference_type is convertible to \c OutputIterator's \c value_type. * * \pre The ranges [first,last) and [result, result + (last - first)) shall not overlap. * * The following code snippet demonstrates how to use \p lower_bound * to search for multiple values in a ordered range. * * \code * #include * #include * ... * thrust::device_vector input(5); * * input[0] = 0; * input[1] = 2; * input[2] = 5; * input[3] = 7; * input[4] = 8; * * thrust::device_vector values(6); * values[0] = 0; * values[1] = 1; * values[2] = 2; * values[3] = 3; * values[4] = 8; * values[5] = 9; * * thrust::device_vector output(6); * * thrust::lower_bound(input.begin(), input.end(), * values.begin(), values.end(), * output.begin()); * * // output is now [0, 1, 1, 2, 4, 5] * \endcode * * \see http://www.sgi.com/tech/stl/lower_bound.html * \see \p upper_bound * \see \p equal_range * \see \p binary_search */ template OutputIterator lower_bound(ForwardIterator first, ForwardIterator last, InputIterator values_first, InputIterator values_last, OutputIterator result); /*! \p lower_bound is a vectorized version of binary search: for each * iterator \c v in [values_first, values_last) it attempts to * find the value *v in an ordered range [first, last). * Specifically, it returns the index of first position where value could * be inserted without violating the ordering. This version of * \p lower_bound uses function object \c comp for comparison. * * The algorithm's execution is parallelized as determined by \p exec. * * \param exec The execution policy to use for parallelization. * \param first The beginning of the ordered sequence. * \param last The end of the ordered sequence. * \param values_first The beginning of the search values sequence. * \param values_last The end of the search values sequence. * \param result The beginning of the output sequence. * \param comp The comparison operator. * * \tparam DerivedPolicy The name of the derived execution policy. * \tparam ForwardIterator is a model of Forward Iterator. * \tparam InputIterator is a model of Input Iterator. * and \c InputIterator's \c value_type is comparable to \p ForwardIterator's \c value_type. * \tparam OutputIterator is a model of Output Iterator. * and \c ForwardIterator's difference_type is convertible to \c OutputIterator's \c value_type. * \tparam StrictWeakOrdering is a model of Strict Weak Ordering. * * \pre The ranges [first,last) and [result, result + (last - first)) shall not overlap. * * The following code snippet demonstrates how to use \p lower_bound * to search for multiple values in a ordered range. * * \code * #include * #include * #include * #include * ... * thrust::device_vector input(5); * * input[0] = 0; * input[1] = 2; * input[2] = 5; * input[3] = 7; * input[4] = 8; * * thrust::device_vector values(6); * values[0] = 0; * values[1] = 1; * values[2] = 2; * values[3] = 3; * values[4] = 8; * values[5] = 9; * * thrust::device_vector output(6); * * thrust::lower_bound(input.begin(), input.end(), * values.begin(), values.end(), * output.begin(), * thrust::less()); * * // output is now [0, 1, 1, 2, 4, 5] * \endcode * * \see http://www.sgi.com/tech/stl/lower_bound.html * \see \p upper_bound * \see \p equal_range * \see \p binary_search */ template OutputIterator lower_bound(const thrust::detail::execution_policy_base &exec, ForwardIterator first, ForwardIterator last, InputIterator values_first, InputIterator values_last, OutputIterator result, StrictWeakOrdering comp); /*! \p lower_bound is a vectorized version of binary search: for each * iterator \c v in [values_first, values_last) it attempts to * find the value *v in an ordered range [first, last). * Specifically, it returns the index of first position where value could * be inserted without violating the ordering. This version of * \p lower_bound uses function object \c comp for comparison. * * \param first The beginning of the ordered sequence. * \param last The end of the ordered sequence. * \param values_first The beginning of the search values sequence. * \param values_last The end of the search values sequence. * \param result The beginning of the output sequence. * \param comp The comparison operator. * * \tparam ForwardIterator is a model of Forward Iterator. * \tparam InputIterator is a model of Input Iterator. * and \c InputIterator's \c value_type is comparable to \p ForwardIterator's \c value_type. * \tparam OutputIterator is a model of Output Iterator. * and \c ForwardIterator's difference_type is convertible to \c OutputIterator's \c value_type. * \tparam StrictWeakOrdering is a model of Strict Weak Ordering. * * \pre The ranges [first,last) and [result, result + (last - first)) shall not overlap. * * The following code snippet demonstrates how to use \p lower_bound * to search for multiple values in a ordered range. * * \code * #include * #include * #include * ... * thrust::device_vector input(5); * * input[0] = 0; * input[1] = 2; * input[2] = 5; * input[3] = 7; * input[4] = 8; * * thrust::device_vector values(6); * values[0] = 0; * values[1] = 1; * values[2] = 2; * values[3] = 3; * values[4] = 8; * values[5] = 9; * * thrust::device_vector output(6); * * thrust::lower_bound(input.begin(), input.end(), * values.begin(), values.end(), * output.begin(), * thrust::less()); * * // output is now [0, 1, 1, 2, 4, 5] * \endcode * * \see http://www.sgi.com/tech/stl/lower_bound.html * \see \p upper_bound * \see \p equal_range * \see \p binary_search */ template OutputIterator lower_bound(ForwardIterator first, ForwardIterator last, InputIterator values_first, InputIterator values_last, OutputIterator result, StrictWeakOrdering comp); /*! \p upper_bound is a vectorized version of binary search: for each * iterator \c v in [values_first, values_last) it attempts to * find the value *v in an ordered range [first, last). * Specifically, it returns the index of last position where value could * be inserted without violating the ordering. * * The algorithm's execution is parallelized as determined by \p exec. * * \param exec The execution policy to use for parallelization. * \param first The beginning of the ordered sequence. * \param last The end of the ordered sequence. * \param values_first The beginning of the search values sequence. * \param values_last The end of the search values sequence. * \param result The beginning of the output sequence. * * \tparam DerivedPolicy The name of the derived execution policy. * \tparam ForwardIterator is a model of Forward Iterator. * \tparam InputIterator is a model of Input Iterator. * and \c InputIterator's \c value_type is LessThanComparable. * \tparam OutputIterator is a model of Output Iterator. * and \c ForwardIterator's difference_type is convertible to \c OutputIterator's \c value_type. * * \pre The ranges [first,last) and [result, result + (last - first)) shall not overlap. * * The following code snippet demonstrates how to use \p lower_bound * to search for multiple values in a ordered range using the \p thrust::device execution policy for * parallelization: * * \code * #include * #include * #include * ... * thrust::device_vector input(5); * * input[0] = 0; * input[1] = 2; * input[2] = 5; * input[3] = 7; * input[4] = 8; * * thrust::device_vector values(6); * values[0] = 0; * values[1] = 1; * values[2] = 2; * values[3] = 3; * values[4] = 8; * values[5] = 9; * * thrust::device_vector output(6); * * thrust::upper_bound(thrust::device, * input.begin(), input.end(), * values.begin(), values.end(), * output.begin()); * * // output is now [1, 1, 2, 2, 5, 5] * \endcode * * \see http://www.sgi.com/tech/stl/upper_bound.html * \see \p upper_bound * \see \p equal_range * \see \p binary_search */ template OutputIterator upper_bound(const thrust::detail::execution_policy_base &exec, ForwardIterator first, ForwardIterator last, InputIterator values_first, InputIterator values_last, OutputIterator result); /*! \p upper_bound is a vectorized version of binary search: for each * iterator \c v in [values_first, values_last) it attempts to * find the value *v in an ordered range [first, last). * Specifically, it returns the index of last position where value could * be inserted without violating the ordering. * * \param first The beginning of the ordered sequence. * \param last The end of the ordered sequence. * \param values_first The beginning of the search values sequence. * \param values_last The end of the search values sequence. * \param result The beginning of the output sequence. * * \tparam ForwardIterator is a model of Forward Iterator. * \tparam InputIterator is a model of Input Iterator. * and \c InputIterator's \c value_type is LessThanComparable. * \tparam OutputIterator is a model of Output Iterator. * and \c ForwardIterator's difference_type is convertible to \c OutputIterator's \c value_type. * * \pre The ranges [first,last) and [result, result + (last - first)) shall not overlap. * * The following code snippet demonstrates how to use \p lower_bound * to search for multiple values in a ordered range. * * \code * #include * #include * ... * thrust::device_vector input(5); * * input[0] = 0; * input[1] = 2; * input[2] = 5; * input[3] = 7; * input[4] = 8; * * thrust::device_vector values(6); * values[0] = 0; * values[1] = 1; * values[2] = 2; * values[3] = 3; * values[4] = 8; * values[5] = 9; * * thrust::device_vector output(6); * * thrust::upper_bound(input.begin(), input.end(), * values.begin(), values.end(), * output.begin()); * * // output is now [1, 1, 2, 2, 5, 5] * \endcode * * \see http://www.sgi.com/tech/stl/upper_bound.html * \see \p upper_bound * \see \p equal_range * \see \p binary_search */ template OutputIterator upper_bound(ForwardIterator first, ForwardIterator last, InputIterator values_first, InputIterator values_last, OutputIterator result); /*! \p upper_bound is a vectorized version of binary search: for each * iterator \c v in [values_first, values_last) it attempts to * find the value *v in an ordered range [first, last). * Specifically, it returns the index of first position where value could * be inserted without violating the ordering. This version of * \p upper_bound uses function object \c comp for comparison. * * The algorithm's execution is parallelized as determined by \p exec. * * \param exec The execution policy to use for parallelization. * \param first The beginning of the ordered sequence. * \param last The end of the ordered sequence. * \param values_first The beginning of the search values sequence. * \param values_last The end of the search values sequence. * \param result The beginning of the output sequence. * \param comp The comparison operator. * * \tparam DerivedPolicy The name of the derived execution policy. * \tparam ForwardIterator is a model of Forward Iterator. * \tparam InputIterator is a model of Input Iterator. * and \c InputIterator's \c value_type is comparable to \p ForwardIterator's \c value_type. * \tparam OutputIterator is a model of Output Iterator. * and \c ForwardIterator's difference_type is convertible to \c OutputIterator's \c value_type. * \tparam StrictWeakOrdering is a model of Strict Weak Ordering. * * \pre The ranges [first,last) and [result, result + (last - first)) shall not overlap. * * The following code snippet demonstrates how to use \p lower_bound * to search for multiple values in a ordered range using the \p thrust::device execution policy for * parallelization: * * \code * #include * #include * #include * #include * ... * thrust::device_vector input(5); * * input[0] = 0; * input[1] = 2; * input[2] = 5; * input[3] = 7; * input[4] = 8; * * thrust::device_vector values(6); * values[0] = 0; * values[1] = 1; * values[2] = 2; * values[3] = 3; * values[4] = 8; * values[5] = 9; * * thrust::device_vector output(6); * * thrust::upper_bound(thrust::device, * input.begin(), input.end(), * values.begin(), values.end(), * output.begin(), * thrust::less()); * * // output is now [1, 1, 2, 2, 5, 5] * \endcode * * \see http://www.sgi.com/tech/stl/upper_bound.html * \see \p lower_bound * \see \p equal_range * \see \p binary_search */ template OutputIterator upper_bound(const thrust::detail::execution_policy_base &exec, ForwardIterator first, ForwardIterator last, InputIterator values_first, InputIterator values_last, OutputIterator result, StrictWeakOrdering comp); /*! \p upper_bound is a vectorized version of binary search: for each * iterator \c v in [values_first, values_last) it attempts to * find the value *v in an ordered range [first, last). * Specifically, it returns the index of first position where value could * be inserted without violating the ordering. This version of * \p upper_bound uses function object \c comp for comparison. * * \param first The beginning of the ordered sequence. * \param last The end of the ordered sequence. * \param values_first The beginning of the search values sequence. * \param values_last The end of the search values sequence. * \param result The beginning of the output sequence. * \param comp The comparison operator. * * \tparam ForwardIterator is a model of Forward Iterator. * \tparam InputIterator is a model of Input Iterator. * and \c InputIterator's \c value_type is comparable to \p ForwardIterator's \c value_type. * \tparam OutputIterator is a model of Output Iterator. * and \c ForwardIterator's difference_type is convertible to \c OutputIterator's \c value_type. * \tparam StrictWeakOrdering is a model of Strict Weak Ordering. * * \pre The ranges [first,last) and [result, result + (last - first)) shall not overlap. * * The following code snippet demonstrates how to use \p lower_bound * to search for multiple values in a ordered range. * * \code * #include * #include * #include * ... * thrust::device_vector input(5); * * input[0] = 0; * input[1] = 2; * input[2] = 5; * input[3] = 7; * input[4] = 8; * * thrust::device_vector values(6); * values[0] = 0; * values[1] = 1; * values[2] = 2; * values[3] = 3; * values[4] = 8; * values[5] = 9; * * thrust::device_vector output(6); * * thrust::upper_bound(input.begin(), input.end(), * values.begin(), values.end(), * output.begin(), * thrust::less()); * * // output is now [1, 1, 2, 2, 5, 5] * \endcode * * \see http://www.sgi.com/tech/stl/upper_bound.html * \see \p lower_bound * \see \p equal_range * \see \p binary_search */ template OutputIterator upper_bound(ForwardIterator first, ForwardIterator last, InputIterator values_first, InputIterator values_last, OutputIterator result, StrictWeakOrdering comp); /*! \p binary_search is a vectorized version of binary search: for each * iterator \c v in [values_first, values_last) it attempts to * find the value *v in an ordered range [first, last). * It returns \c true if an element that is equivalent to \c value * is present in [first, last) and \c false if no such element * exists. * * The algorithm's execution is parallelized as determined by \p exec. * * \param exec The execution policy to use for parallelization. * \param first The beginning of the ordered sequence. * \param last The end of the ordered sequence. * \param values_first The beginning of the search values sequence. * \param values_last The end of the search values sequence. * \param result The beginning of the output sequence. * * \tparam DerivedPolicy The name of the derived execution policy. * \tparam ForwardIterator is a model of Forward Iterator. * \tparam InputIterator is a model of Input Iterator. * and \c InputIterator's \c value_type is LessThanComparable. * \tparam OutputIterator is a model of Output Iterator. * and bool is convertible to \c OutputIterator's \c value_type. * * \pre The ranges [first,last) and [result, result + (last - first)) shall not overlap. * * The following code snippet demonstrates how to use \p binary_search * to search for multiple values in a ordered range using the \p thrust::device execution policy for * parallelization: * * \code * #include * #include * #include * ... * thrust::device_vector input(5); * * input[0] = 0; * input[1] = 2; * input[2] = 5; * input[3] = 7; * input[4] = 8; * * thrust::device_vector values(6); * values[0] = 0; * values[1] = 1; * values[2] = 2; * values[3] = 3; * values[4] = 8; * values[5] = 9; * * thrust::device_vector output(6); * * thrust::binary_search(thrust::device, * input.begin(), input.end(), * values.begin(), values.end(), * output.begin()); * * // output is now [true, false, true, false, true, false] * \endcode * * \see http://www.sgi.com/tech/stl/binary_search.html * \see \p lower_bound * \see \p upper_bound * \see \p equal_range */ template OutputIterator binary_search(const thrust::detail::execution_policy_base &exec, ForwardIterator first, ForwardIterator last, InputIterator values_first, InputIterator values_last, OutputIterator result); /*! \p binary_search is a vectorized version of binary search: for each * iterator \c v in [values_first, values_last) it attempts to * find the value *v in an ordered range [first, last). * It returns \c true if an element that is equivalent to \c value * is present in [first, last) and \c false if no such element * exists. * * \param first The beginning of the ordered sequence. * \param last The end of the ordered sequence. * \param values_first The beginning of the search values sequence. * \param values_last The end of the search values sequence. * \param result The beginning of the output sequence. * * \tparam ForwardIterator is a model of Forward Iterator. * \tparam InputIterator is a model of Input Iterator. * and \c InputIterator's \c value_type is LessThanComparable. * \tparam OutputIterator is a model of Output Iterator. * and bool is convertible to \c OutputIterator's \c value_type. * * \pre The ranges [first,last) and [result, result + (last - first)) shall not overlap. * * The following code snippet demonstrates how to use \p binary_search * to search for multiple values in a ordered range. * * \code * #include * #include * ... * thrust::device_vector input(5); * * input[0] = 0; * input[1] = 2; * input[2] = 5; * input[3] = 7; * input[4] = 8; * * thrust::device_vector values(6); * values[0] = 0; * values[1] = 1; * values[2] = 2; * values[3] = 3; * values[4] = 8; * values[5] = 9; * * thrust::device_vector output(6); * * thrust::binary_search(input.begin(), input.end(), * values.begin(), values.end(), * output.begin()); * * // output is now [true, false, true, false, true, false] * \endcode * * \see http://www.sgi.com/tech/stl/binary_search.html * \see \p lower_bound * \see \p upper_bound * \see \p equal_range */ template OutputIterator binary_search(ForwardIterator first, ForwardIterator last, InputIterator values_first, InputIterator values_last, OutputIterator result); /*! \p binary_search is a vectorized version of binary search: for each * iterator \c v in [values_first, values_last) it attempts to * find the value *v in an ordered range [first, last). * It returns \c true if an element that is equivalent to \c value * is present in [first, last) and \c false if no such element * exists. This version of \p binary_search uses function object * \c comp for comparison. * * The algorithm's execution is parallelized as determined by \p exec. * * \param exec The execution policy to use for parallelization. * \param first The beginning of the ordered sequence. * \param last The end of the ordered sequence. * \param values_first The beginning of the search values sequence. * \param values_last The end of the search values sequence. * \param result The beginning of the output sequence. * \param comp The comparison operator. * * \tparam DerivedPolicy The name of the derived execution policy. * \tparam ForwardIterator is a model of Forward Iterator. * \tparam InputIterator is a model of Input Iterator. * and \c InputIterator's \c value_type is LessThanComparable. * \tparam OutputIterator is a model of Output Iterator. * and bool is convertible to \c OutputIterator's \c value_type. * \tparam StrictWeakOrdering is a model of Strict Weak Ordering. * * \pre The ranges [first,last) and [result, result + (last - first)) shall not overlap. * * The following code snippet demonstrates how to use \p binary_search * to search for multiple values in a ordered range using the \p thrust::device execution policy for * parallelization: * * \code * #include * #include * #include * #include * ... * thrust::device_vector input(5); * * input[0] = 0; * input[1] = 2; * input[2] = 5; * input[3] = 7; * input[4] = 8; * * thrust::device_vector values(6); * values[0] = 0; * values[1] = 1; * values[2] = 2; * values[3] = 3; * values[4] = 8; * values[5] = 9; * * thrust::device_vector output(6); * * thrust::binary_search(thrust::device, * input.begin(), input.end(), * values.begin(), values.end(), * output.begin(), * thrust::less()); * * // output is now [true, false, true, false, true, false] * \endcode * * \see http://www.sgi.com/tech/stl/binary_search.html * \see \p lower_bound * \see \p upper_bound * \see \p equal_range */ template OutputIterator binary_search(const thrust::detail::execution_policy_base &exec, ForwardIterator first, ForwardIterator last, InputIterator values_first, InputIterator values_last, OutputIterator result, StrictWeakOrdering comp); /*! \p binary_search is a vectorized version of binary search: for each * iterator \c v in [values_first, values_last) it attempts to * find the value *v in an ordered range [first, last). * It returns \c true if an element that is equivalent to \c value * is present in [first, last) and \c false if no such element * exists. This version of \p binary_search uses function object * \c comp for comparison. * * \param first The beginning of the ordered sequence. * \param last The end of the ordered sequence. * \param values_first The beginning of the search values sequence. * \param values_last The end of the search values sequence. * \param result The beginning of the output sequence. * \param comp The comparison operator. * * \tparam ForwardIterator is a model of Forward Iterator. * \tparam InputIterator is a model of Input Iterator. * and \c InputIterator's \c value_type is LessThanComparable. * \tparam OutputIterator is a model of Output Iterator. * and bool is convertible to \c OutputIterator's \c value_type. * \tparam StrictWeakOrdering is a model of Strict Weak Ordering. * * \pre The ranges [first,last) and [result, result + (last - first)) shall not overlap. * * The following code snippet demonstrates how to use \p binary_search * to search for multiple values in a ordered range. * * \code * #include * #include * #include * ... * thrust::device_vector input(5); * * input[0] = 0; * input[1] = 2; * input[2] = 5; * input[3] = 7; * input[4] = 8; * * thrust::device_vector values(6); * values[0] = 0; * values[1] = 1; * values[2] = 2; * values[3] = 3; * values[4] = 8; * values[5] = 9; * * thrust::device_vector output(6); * * thrust::binary_search(input.begin(), input.end(), * values.begin(), values.end(), * output.begin(), * thrust::less()); * * // output is now [true, false, true, false, true, false] * \endcode * * \see http://www.sgi.com/tech/stl/binary_search.html * \see \p lower_bound * \see \p upper_bound * \see \p equal_range */ template OutputIterator binary_search(ForwardIterator first, ForwardIterator last, InputIterator values_first, InputIterator values_last, OutputIterator result, StrictWeakOrdering comp); /*! \} // end vectorized_binary_search */ /*! \} // end binary_search */ /*! \} // end searching */ } // end namespace thrust #include