@@ -203,17 +203,36 @@ It remove_by_index(It First, EndIt Last, IdxIt FirstIndex, IdxEndIt LastIndex) {
203203
204204 auto CurrIdx = *FirstIndex;
205205
206- // / TODO: Optimize this loop
206+ if constexpr (std::is_same_v<It, EndIt> &&
207+ std::is_same_v<
208+ std::random_access_iterator_tag,
209+ typename std::iterator_traits<It>::iterator_category>) {
210+ size_t GapSize = 1 ;
211+ auto Curr = First + 1 ;
212+
213+ while (++FirstIndex != LastIndex) {
214+ auto Offset = *FirstIndex - CurrIdx - 1 ;
215+ if (Offset >= std::distance (Curr, Last)) {
216+ break ;
217+ }
218+ First = std::move (Curr, Curr + Offset, First);
219+ CurrIdx = *FirstIndex;
220+ Curr = First + ++GapSize;
221+ }
207222
208- for (auto I = First; ++I != Last; ++CurrIdx) {
209- if (FirstIndex == LastIndex || CurrIdx != *FirstIndex) {
210- *First++ = std::move (*I);
211- if (FirstIndex != LastIndex) {
212- ++FirstIndex;
223+ return std::move (Curr, Last, First);
224+ } else {
225+
226+ for (auto I = First; I != Last; ++CurrIdx, ++I) {
227+ if (CurrIdx != *FirstIndex) {
228+ *First++ = std::move (*I);
229+ if (++FirstIndex == LastIndex) {
230+ return std::move (std::next (I), Last, First);
231+ }
213232 }
214233 }
234+ return First;
215235 }
216- return First;
217236}
218237
219238template <typename Container, typename IdxIt, typename IdxEndIt>
0 commit comments