dl
dl_range_erase.h
浏览该文件的文档.
1
12#pragma once
13
14#include "base/dl_range_any.h"
15
16#include <algorithm>
17
19namespace dl::Erase
20{
27template<typename T, typename V>
28bool HeadFromLast(T& container, const V& a)
29{
30 auto iter = find(container.rbegin(), container.rend(), a);
31 if (iter == container.rend())
32 return false;
33 container.erase(container.begin(), iter.base());
34 return true;
35}
36
43template<typename T, typename V>
44bool TailFromLast(T& container, const V& a)
45{
46 auto iter = find(container.rbegin(), container.rend(), a);
47 if (iter == container.rend())
48 return false;
49 container.erase(iter.base(), container.end());
50 return true;
51}
52
58template<typename T, typename V>
59bool TailFromFirst(T& container, const V& a)
60{
61 auto iter = find(container.begin(), container.end(), a);
62 if (iter == container.end())
63 return false;
64 container.erase(iter, container.end());
65 return true;
66}
67
73template<typename T>
74void TailFromFirstSub(T& container, const T& sub)
75{
76 auto iter_cur = container.begin();
77 auto iter_acur = sub.begin();
78 auto iter_delete = iter_cur;
79 bool isSuccess = false;
80 for (iter_cur; iter_cur != container.end();)
81 {
82 while (*iter_cur == *iter_acur)
83 {
84 iter_cur++;
85 iter_acur++;
86 if (iter_acur == sub.end())
87 {
88 isSuccess = true;
89 break;
90 }
91 }
92 if (isSuccess)
93 break;
94 iter_cur++;
95 iter_acur = sub.begin();
96 iter_delete = iter_cur;
97 }
98 if (isSuccess)
99 container.erase(iter_delete, container.end());
100}
101
104template<typename T>
105void Match(T& a, const T& b)
106{
107 for (auto iter = a.begin(); iter != a.end();)
108 {
109 if (Any::Equal(b, *iter))
110 iter = a.erase(iter);
111 else
112 ++iter;
113 }
114}
115
118template<typename T>
119T Match(const T& a, const T& b)
120{
121 T ret;
122 for (auto& iter : a)
123 {
124 if (!Any::Equal(b, iter))
125 ret.push_back(b);
126 }
127 return ret;
128}
129
134template<typename T>
135bool HeadSub(T& a, const T& b)
136{
137 auto iter0 = std::search(a.begin(), a.end(), b.begin(), b.end());
138 if (iter0 == a.end())
139 return false;
140 auto iter1 = iter0;
141 std::advance(iter1, b.size());
142 a.erase(iter0, iter1);
143 return true;
144}
145
150template<typename T>
151size_t AllSub(T& a, const T& b)
152{
153 size_t i = 0;
154 while (HeadSub(a, b))
155 {
156 ++i;
157 }
158 return i;
159}
160
166template<typename C, typename V>
167bool First(C& container, const V& v)
168{
169 for (auto iter = container.begin(); iter != container.end(); ++iter)
170 {
171 if (*iter == v)
172 {
173 container.erase(iter);
174 return true;
175 }
176 }
177 return false;
178}
179
180}
范围操作 任一满足条件
bool Equal(const C &container, const V &v)
判断容器任意元素等于某值
移除算法
size_t AllSub(T &a, const T &b)
移除子串,所有
bool First(C &container, const V &v)
移除第一个找到的值
bool TailFromFirst(T &container, const V &a)
从容器container中移除 最开始 匹配到的a元素 之后(包含a)的所有元素,如果没有匹配到,则什么都不做。
void Match(T &a, const T &b)
从容器a中移除 存在于容器b的元素
void TailFromFirstSub(T &container, const T &sub)
从容器container中移除 最开始 匹配到的子容器a 之后(不包含a)的所有元素,如果没有匹配到,则什么都不做。
bool HeadSub(T &a, const T &b)
移除子串,第一个
bool TailFromLast(T &container, const V &a)
从容器container中移除 最后 匹配到的a元素 之后(不包含a)的所有元素,如果没有匹配到,则什么都不做。
bool HeadFromLast(T &container, const V &a)
从容器container中移除 最后 匹配到的a元素 之前(包含a)的所有元素,如果没有匹配到,则什么都不做。