1#ifndef NEFORCE_CORE_ALGORITHM_REMOVE_HPP__
2#define NEFORCE_CORE_ALGORITHM_REMOVE_HPP__
14NEFORCE_BEGIN_NAMESPACE__
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");
49 for (; first != last; ++first) {
50 if (*first != value) {
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");
77 for (; first != last; ++first) {
101template <
typename Iterator,
typename T>
102constexpr Iterator
remove(Iterator first, Iterator last,
const T& value) {
105 first = _NEFORCE
find(first, last, value);
107 for (Iterator i = first; ++i != last;) {
108 if (!(*i == value)) {
109 *first = _NEFORCE
move(*i);
132template <
typename Iterator,
typename Predicate>
133constexpr Iterator
remove_if(Iterator first, Iterator last, Predicate pred) {
136 first = _NEFORCE
find_if(first, last, pred);
138 for (Iterator i = first; ++i != last;) {
140 *first = _NEFORCE
move(*i);
161template <
typename Container,
typename U>
162constexpr size_t erase(Container& cont,
const U& value) {
163 using value_type =
typename Container::value_type;
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();
186template <
typename Container,
typename Predicate>
187constexpr size_t erase_if(Container& cont, Predicate pred) {
188 using value_type =
typename Container::value_type;
190 const size_t old_size = cont.size();
191 const auto end = cont.end();
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();
202NEFORCE_END_NAMESPACE__
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()))
获取容器的结束迭代器