NexusForce 1.0.0
A Modern C++ Library with extended functionality, web components, and utility libraries
载入中...
搜索中...
未找到
remove.hpp
浏览该文件的文档.
1#ifndef NEFORCE_CORE_ALGORITHM_REMOVE_HPP__
2#define NEFORCE_CORE_ALGORITHM_REMOVE_HPP__
3
11
14NEFORCE_BEGIN_NAMESPACE__
15
21
27
44template <typename Iterator1, typename Iterator2, typename T>
45constexpr Iterator2 remove_copy(Iterator1 first, Iterator1 last, Iterator2 result, const T& value) {
47 "Iterator must be forward_iterator");
48
49 for (; first != last; ++first) {
50 if (*first != value) {
51 *result = *first;
52 ++result;
53 }
54 }
55 return result;
56}
57
72template <typename Iterator1, typename Iterator2, typename Predicate>
73constexpr Iterator2 remove_copy_if(Iterator1 first, Iterator1 last, Iterator2 result, Predicate pred) {
75 "Iterator must be forward_iterator");
76
77 for (; first != last; ++first) {
78 if (!pred(*first)) {
79 *result = *first;
80 ++result;
81 }
82 }
83 return result;
84}
85
101template <typename Iterator, typename T>
102constexpr Iterator remove(Iterator first, Iterator last, const T& value) {
103 static_assert(is_ranges_fwd_iter_v<Iterator>, "Iterator must be forward_iterator");
104
105 first = _NEFORCE find(first, last, value);
106 Iterator next = first;
107 return first == last ? first : _NEFORCE remove_copy(++next, last, first, value);
108}
109
125template <typename Iterator, typename Predicate>
126constexpr Iterator remove_if(Iterator first, Iterator last, Predicate pred) {
127 static_assert(is_ranges_fwd_iter_v<Iterator>, "Iterator must be forward_iterator");
128
129 first = _NEFORCE find_if(first, last, pred);
130 Iterator next = first;
131 return first == last ? first : _NEFORCE remove_copy_if(++next, last, first, pred);
132}
133
148template <typename Container, typename U>
149constexpr size_t erase(Container& cont, const U& value) {
150 static_assert(declval<decltype(*cont.begin())>().operator==(declval<U>()),
151 "U must be comparable to the value type of Container");
152
153 const auto old_size = cont.size();
154 const auto end = cont.end();
155 auto removed = _NEFORCE remove_if(cont.begin(), end, [&value](const auto& iter) { return *iter == value; });
156 cont.erase(removed, end);
157 return old_size - cont.size();
158}
159
174template <typename Container, typename Predicate>
175constexpr size_t erase_if(Container& cont, Predicate pred) {
176 const size_t old_size = cont.size();
177 const auto end = cont.end();
178 auto removed = _NEFORCE remove_if(cont.begin(), end,
179 [ref_pred = _NEFORCE ref(pred)](const auto& iter) { return ref_pred(*iter); });
180 cont.erase(removed, end);
181 return old_size - cont.size();
182}
183 // RemoveAlgorithms
185 // StandardAlgorithms
187
188NEFORCE_END_NAMESPACE__
189#endif // NEFORCE_CORE_ALGORITHM_REMOVE_HPP__
add_rvalue_reference_t< T > declval() noexcept
获取类型的右值引用,仅用于非求值上下文
constexpr Iterator find_if(Iterator first, Iterator last, Predicate pred)
查找范围内第一个满足谓词的元素
NEFORCE_NODISCARD constexpr Iterator find(Iterator first, Iterator last, const T &value)
查找范围内第一个等于指定值的元素
NEFORCE_INLINE17 constexpr bool is_ranges_fwd_iter_v
检查是否为范围前向迭代器
constexpr Iterator next(Iterator iter, iter_difference_t< Iterator > n=1)
获取迭代器的后一个位置
NEFORCE_NODISCARD constexpr reference_wrapper< T > ref(T &val) noexcept
创建引用包装器
constexpr Iterator remove_if(Iterator first, Iterator last, Predicate pred)
移除范围中满足谓词的元素
constexpr Iterator2 remove_copy(Iterator1 first, Iterator1 last, Iterator2 result, const T &value)
复制范围中不等于指定值的元素
constexpr size_t erase_if(Container &cont, Predicate pred)
从容器中删除所有满足谓词的元素
constexpr size_t erase(Container &cont, const U &value)
从容器中删除所有等于指定值的元素
constexpr Iterator remove(Iterator first, Iterator last, const T &value)
移除范围中等于指定值的元素
constexpr Iterator2 remove_copy_if(Iterator1 first, Iterator1 last, Iterator2 result, Predicate pred)
复制范围中不满足谓词的元素
NEFORCE_NODISCARD NEFORCE_ALWAYS_INLINE constexpr decltype(auto) end(Container &cont) noexcept(noexcept(cont.end()))
获取容器的结束迭代器
引用包装器
查找和搜索算法