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 if (first != last) {
107 for (Iterator i = first; ++i != last;) {
108 if (!(*i == value)) {
109 *first = _NEFORCE move(*i);
110 ++first;
111 }
112 }
113 }
114 return first;
115}
116
132template <typename Iterator, typename Predicate>
133constexpr Iterator remove_if(Iterator first, Iterator last, Predicate pred) {
134 static_assert(is_ranges_fwd_iter_v<Iterator>, "Iterator must be forward_iterator");
135
136 first = _NEFORCE find_if(first, last, pred);
137 if (first != last) {
138 for (Iterator i = first; ++i != last;) {
139 if (!pred(*i)) {
140 *first = _NEFORCE move(*i);
141 ++first;
142 }
143 }
144 }
145 return first;
146}
147
161template <typename Container, typename U>
162constexpr size_t erase(Container& cont, const U& value) {
163 using value_type = typename Container::value_type;
164
165 const auto old_size = cont.size();
166 const auto end = cont.end();
167 auto removed = _NEFORCE remove_if(cont.begin(), end, [&value](const value_type& iter) { return iter == value; });
168 cont.erase(removed, end);
169 return old_size - cont.size();
170}
171
186template <typename Container, typename Predicate>
187constexpr size_t erase_if(Container& cont, Predicate pred) {
188 using value_type = typename Container::value_type;
189
190 const size_t old_size = cont.size();
191 const auto end = cont.end();
192 auto removed = _NEFORCE remove_if(
193 cont.begin(), end, [ref_pred = _NEFORCE ref(pred)](const value_type& iter) { return ref_pred(iter); });
194 cont.erase(removed, end);
195 return old_size - cont.size();
196}
197 // RemoveAlgorithms
199 // StandardAlgorithms
201
202NEFORCE_END_NAMESPACE__
203#endif // NEFORCE_CORE_ALGORITHM_REMOVE_HPP__
constexpr Iterator find_if(Iterator first, Iterator last, Predicate pred)
查找范围内第一个满足谓词的元素
constexpr Iterator find(Iterator first, Iterator last, const T &value)
查找范围内第一个等于指定值的元素
constexpr bool is_ranges_fwd_iter_v
检查是否为范围前向迭代器
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)
复制范围中不满足谓词的元素
constexpr Iterator2 move(Iterator1 first, Iterator1 last, Iterator2 result) noexcept(noexcept(inner::__move_aux(first, last, result)))
移动范围元素
constexpr decltype(auto) end(Container &cont) noexcept(noexcept(cont.end()))
获取容器的结束迭代器
引用包装器
查找和搜索算法