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);
106 Iterator
next = first;
107 return first == last ? first : _NEFORCE
remove_copy(++
next, last, first, value);
125template <
typename Iterator,
typename Predicate>
126constexpr Iterator
remove_if(Iterator first, Iterator last, Predicate pred) {
129 first = _NEFORCE
find_if(first, last, pred);
130 Iterator
next = first;
148template <
typename Container,
typename U>
149constexpr size_t erase(Container& cont,
const U& value) {
151 "U must be comparable to the value type of Container");
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();
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();
179 [ref_pred = _NEFORCE
ref(pred)](
const auto& iter) {
return ref_pred(*iter); });
180 cont.erase(removed,
end);
181 return old_size - cont.size();
188NEFORCE_END_NAMESPACE__
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()))
获取容器的结束迭代器