dl
dl_range_sub.h
浏览该文件的文档.
1
12#pragma once
13
15namespace dl::Sub
16{
23template<typename T>
24bool IsSub(const T& a, const T& b)
25{
26 return std::search(a.begin(), a.end(), b.begin(), b.end()) != a.end();
27}
28
33template<typename T>
34bool IsBegin(const T& a, const T& b)
35{
36 auto iter_a = a.begin();
37 auto iter_b = b.begin();
38 while (iter_b != b.end())
39 {
40 if (iter_a == a.end())
41 return false;
42 if (*iter_b != *iter_a)
43 return false;
44 ++iter_a;
45 ++iter_b;
46 }
47 return true;
48}
49
55template<typename T, typename V>
56T Range(const T& c, const V& a, const V& b)
57{
58 auto iter_a = std::find(c.begin(), c.end(), a);
59 if (iter_a == c.end())
60 return {};
61 ++iter_a;
62 auto iter_b = iter_a;
63
64 while (iter_b != c.end())
65 {
66 if (*iter_b == b)
67 return { iter_a, iter_b };
68 ++iter_b;
69 }
70 return {};
71}
72
76template<typename T, typename V>
77T Tail(const T& c, const V& a)
78{
79 auto iter = std::find(c.begin(), c.end(), a);
80 if (iter == c.end())
81 return {};
82 return { ++iter , c.end() };
83}
84
88template<typename T>
89bool IsTail(const T& a, const T& b)
90{
91 auto iter_a = a.rbegin();
92 auto iter_b = b.rbegin();
93 while (iter_b != b.rend())
94 {
95 if (iter_a == a.rend())
96 return false;
97 if (*iter_b != *iter_a)
98 return false;
99 ++iter_a;
100 ++iter_b;
101 }
102 return true;
103}
104
105//template <typename T, typename F>
106//T RangeUntil(const T& c, const F& func)
107//{
108//
109//}
110
118template<typename T>
119T ReplaceAll(const T& a, const T& sub, const T& tar)
120{
121 if (sub.empty())
122 return a;
123 T ret;
124 auto iter_a = a.begin();
125 while (iter_a != a.end())
126 {
127 bool equal = true;
128 auto iter0 = iter_a;
129 auto iter1 = sub.begin();
130 while (iter1 != sub.end())
131 {
132 if (iter0 == a.end()
133 || iter1 == sub.end()
134 || *iter0 != *iter1)
135 {
136 equal = false;
137 break;
138 }
139 ++iter0;
140 ++iter1;
141 }
142 if (equal)
143 {
144 ret += tar;
145 iter_a += sub.size();
146 }
147 else
148 {
149 ret.push_back(*iter_a);
150 ++iter_a;
151 }
152 }
153 return ret;
154}
155}
类似子串的操作
T ReplaceAll(const T &a, const T &sub, const T &tar)
子串替换
bool IsSub(const T &a, const T &b)
子串匹配
T Tail(const T &c, const V &a)
返回尾部
T Range(const T &c, const V &a, const V &b)
区间匹配
bool IsBegin(const T &a, const T &b)
子串匹配
bool IsTail(const T &a, const T &b)
子串匹配