#include <vector>
#include <deque>
#include <algorithm>
#include <functional>
template <class T,class SizeType = std::size_t>
class ArrayList{
std::vector<SizeType> Indexes;
std::vector<T> Elements;
std::deque<SizeType> Removes;
public:
ArrayList(){}
bool Push_Back(const T& Item){
SizeType Idx = 0;
if(Removes.size() != 0){
Idx = Removes.front();
Removes.pop_front();
}else{
Idx = Indexes.size();
}
Indexes.push_back(Idx);
if(Elements.size() <= Idx){
Elements.push_back(Item);
}else{
Elements[Idx] = Item;
}
return true;
}
bool Erase(std::size_t Idx){
SizeType I = Indexes[Idx];
Indexes.erase((Indexes.begin()+Idx));
Removes.push_back(I);
return true;
}
bool GabageCollect(){//ここがわからん。。。
std::sort(Removes.begin(),Removes.end(),std::less<SizeType>());
SizeType j=0,k=0,l = Removes.size();
for(SizeType i=0;i<Indexes.size();i++){
if(i == Removes[j]-l){
j++;
k++;
//continue;
}
if(Indexes[i-k]>=i)Indexes[i-k]-=k;
}
std::for_each(Removes.begin(),Removes.end(),[&](SizeType Idx){Elements.erase(Elements.begin()+Idx);});
Removes.clear();
return true;
}
const SizeType Size(){
return Indexes.size();
}
const SizeType Capacity(){
return Elements.capacity();
}
T& operator [](SizeType Idx){
return Elements[Indexes[Idx]];
}
const T& operator [](SizeType Idx) const{
return Elements[Indexes[Idx]];
}
};
#include <iostream>
int main(){
ArrayList<int> Array;
for(int i=0;i<8;i++){
Array.Push_Back(i);
}
Array.Erase(3);
Array.Erase(4);
Array.Erase(5);
Array.Push_Back(9);
Array.GabageCollect();
for(int i=0;i<Array.Size();i++){
std::cout<<Array[i]<<' '<<std::endl;
}
return 0;
}
I2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPGRlcXVlPgojaW5jbHVkZSA8YWxnb3JpdGhtPgojaW5jbHVkZSA8ZnVuY3Rpb25hbD4KCnRlbXBsYXRlIDxjbGFzcyBULGNsYXNzIFNpemVUeXBlID0gc3RkOjpzaXplX3Q+CmNsYXNzIEFycmF5TGlzdHsKICAgIHN0ZDo6dmVjdG9yPFNpemVUeXBlPiBJbmRleGVzOwoJc3RkOjp2ZWN0b3I8VD4gRWxlbWVudHM7CglzdGQ6OmRlcXVlPFNpemVUeXBlPiBSZW1vdmVzOwoKcHVibGljOgoJQXJyYXlMaXN0KCl7fQoKCWJvb2wgUHVzaF9CYWNrKGNvbnN0IFQmIEl0ZW0pewoJCVNpemVUeXBlIElkeCA9IDA7CgkKCQlpZihSZW1vdmVzLnNpemUoKSAhPSAwKXsKCQkJSWR4ID0gUmVtb3Zlcy5mcm9udCgpOwoJCQlSZW1vdmVzLnBvcF9mcm9udCgpOwoJCX1lbHNlewoJCQlJZHggPSBJbmRleGVzLnNpemUoKTsKCQl9CgkKCQlJbmRleGVzLnB1c2hfYmFjayhJZHgpOwoJCWlmKEVsZW1lbnRzLnNpemUoKSA8PSBJZHgpewoJCQlFbGVtZW50cy5wdXNoX2JhY2soSXRlbSk7CgkJfWVsc2V7CgkJCUVsZW1lbnRzW0lkeF0gPSBJdGVtOwoJCX0KCQkJcmV0dXJuIHRydWU7CgkKCX0KCglib29sIEVyYXNlKHN0ZDo6c2l6ZV90IElkeCl7CgkJU2l6ZVR5cGUgSSA9IEluZGV4ZXNbSWR4XTsKCQlJbmRleGVzLmVyYXNlKChJbmRleGVzLmJlZ2luKCkrSWR4KSk7CgkJUmVtb3Zlcy5wdXNoX2JhY2soSSk7CgoJCXJldHVybiB0cnVlOwoJfQoKCWJvb2wgR2FiYWdlQ29sbGVjdCgpey8v44GT44GT44GM44KP44GL44KJ44KT44CC44CC44CCCgkJc3RkOjpzb3J0KFJlbW92ZXMuYmVnaW4oKSxSZW1vdmVzLmVuZCgpLHN0ZDo6bGVzczxTaXplVHlwZT4oKSk7CgkJCgkJU2l6ZVR5cGUgaj0wLGs9MCxsID0gUmVtb3Zlcy5zaXplKCk7CgkJZm9yKFNpemVUeXBlIGk9MDtpPEluZGV4ZXMuc2l6ZSgpO2krKyl7CgkJCWlmKGkgPT0gUmVtb3Zlc1tqXS1sKXsKCQkJCWorKzsKCQkJCWsrKzsKCQkJCS8vY29udGludWU7CgkJCX0KCQkJaWYoSW5kZXhlc1tpLWtdPj1pKUluZGV4ZXNbaS1rXS09azsKCgkJfQoKCQlzdGQ6OmZvcl9lYWNoKFJlbW92ZXMuYmVnaW4oKSxSZW1vdmVzLmVuZCgpLFsmXShTaXplVHlwZSBJZHgpe0VsZW1lbnRzLmVyYXNlKEVsZW1lbnRzLmJlZ2luKCkrSWR4KTt9KTsKCQlSZW1vdmVzLmNsZWFyKCk7CgoJCXJldHVybiB0cnVlOwoJfQoKCWNvbnN0IFNpemVUeXBlIFNpemUoKXsKCQlyZXR1cm4gSW5kZXhlcy5zaXplKCk7Cgl9Cgljb25zdCBTaXplVHlwZSBDYXBhY2l0eSgpewoJCXJldHVybiBFbGVtZW50cy5jYXBhY2l0eSgpOwoJfQoKCVQmIG9wZXJhdG9yIFtdKFNpemVUeXBlIElkeCl7CgkJcmV0dXJuIEVsZW1lbnRzW0luZGV4ZXNbSWR4XV07Cgl9Cgljb25zdCBUJiBvcGVyYXRvciBbXShTaXplVHlwZSBJZHgpIGNvbnN0ewoJCXJldHVybiBFbGVtZW50c1tJbmRleGVzW0lkeF1dOwoJfQp9OwojaW5jbHVkZSA8aW9zdHJlYW0+CgppbnQgbWFpbigpewoJQXJyYXlMaXN0PGludD4gQXJyYXk7CgoJZm9yKGludCBpPTA7aTw4O2krKyl7CgkJQXJyYXkuUHVzaF9CYWNrKGkpOwoJfQoKCUFycmF5LkVyYXNlKDMpOwoJQXJyYXkuRXJhc2UoNCk7CglBcnJheS5FcmFzZSg1KTsKCUFycmF5LlB1c2hfQmFjayg5KTsKCglBcnJheS5HYWJhZ2VDb2xsZWN0KCk7CgoJZm9yKGludCBpPTA7aTxBcnJheS5TaXplKCk7aSsrKXsKCQlzdGQ6OmNvdXQ8PEFycmF5W2ldPDwnICc8PHN0ZDo6ZW5kbDsKCX0KCglyZXR1cm4gMDsKfQ==