summaryrefslogtreecommitdiff
path: root/libs/algorithm/doc/find_not.qbk
diff options
context:
space:
mode:
Diffstat (limited to 'libs/algorithm/doc/find_not.qbk')
-rw-r--r--libs/algorithm/doc/find_not.qbk83
1 files changed, 83 insertions, 0 deletions
diff --git a/libs/algorithm/doc/find_not.qbk b/libs/algorithm/doc/find_not.qbk
new file mode 100644
index 0000000000..6df0482477
--- /dev/null
+++ b/libs/algorithm/doc/find_not.qbk
@@ -0,0 +1,83 @@
+[/ File find_not.qbk]
+
+[section:find_not find_not ]
+
+[/license
+Copyright (c) 2018 T. Zachary Laine
+
+Distributed under the Boost Software License, Version 1.0.
+(See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+]
+
+The header file 'find_not.hpp' contains a variants of a the stl algorithm
+`find`. The algorithm finds the first value in the given sequence that is not
+equal to the given value.
+
+Consider this use of `find()`:
+
+ auto std::vector<int> vec = { 1, 1, 2 };
+ auto it = std::find(vec.begin(), vec.end(), 1);
+
+This gives us the first occurance of `1` in `vec`. What if we want to find
+the first occurrance of any number besides `1` in `vec`? We have to write an
+unfortunate amount of code:
+
+ auto std::vector<int> vec = { 1, 1, 2 };
+ auto it = std::find_if(vec.begin(), vec.end(), [](int i) { return i != 1; });
+
+With `find_not()` the code gets much more terse:
+
+ auto std::vector<int> vec = { 1, 1, 2 };
+ auto it = find_not(vec.begin(), vec.end(), 1);
+
+The existing `find` variants are: `find()`, `find_if()`, and `find_if_not()`.
+It seems natural to also have `find_not()`, for the very reason that we have
+`find_if_not()` -- to avoid having to write a lambda to wrap the negation of
+the find condition.
+
+[heading interface]
+
+ template<typename InputIter, typename Sentinel, typename T>
+ InputIter find_not(InputIter first, Sentinel last, const T & x);
+
+ template<typename Range, typename T>
+ boost::range_iterator<Range> find_not(Range & r, const T & x);
+
+These overloads of `find_not` return the first value that is not equal to `x`
+in the sequence `[first, last)` or `r`, respectively.
+
+[heading Examples]
+
+Given the container `c1` containing `{ 0, 1, 2 }`, then
+
+ find_not ( c1.begin(), c1.end(), 1 ) --> c1.begin()
+ find_not ( c1.begin(), c1.end(), 0 ) --> std::next(c1.begin())
+
+[heading Iterator Requirements]
+
+`find_not` works on all iterators except output iterators.
+
+The template parameter `Sentinel` is allowed to be different from `InputIter`,
+or they may be the same. For an `InputIter` `it` and a `Sentinel` `end`, `it
+== end` and `it != end` must be well-formed expressions.
+
+[heading Complexity]
+
+Linear.
+
+[heading Exception Safety]
+
+`find_not` takes its parameters by value and do not depend upon any global
+state. Therefore, it provides the strong exception guarantee.
+
+[heading Notes]
+
+`constexpr` in C++14 or later.
+
+[endsect]
+
+[/ File equal.qbk
+Copyright 2018 T. Zachary Laine
+Distributed under the Boost Software License, Version 1.0.
+(See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt).
+]