しかし、クラス,テンプレート,演算子オーバーロードの良い勉強になりました。
強化された機能:
・添字を使って要素にアクセス可能
・slist型,list型の他に、vector型や、要素の型で代入演算子が使用可能
・
#include
template
class slist :public std::list{
iterator itBeg;
iterator itEnd;
public:
int restsize;
template
slist& add(_Iter begor, _Iter endor){
insert(end(), begor, endor);
return *this;
}
SLIST& operator[] (const int &num){
iterator it = begin();
std::advance(it, num);
return *it;
}
slist& operator &slist){
insert(end(), slist.begin(), slist.end() );
return *this;
}
slist& operator &list){
insert(end(), list.begin(), list.end() );
return *this;
}
slist& operator& operator &arr){
insert(end(), arr.begin(), arr.end() );
return *this;
}
template
slist& operator &scope){
insert(end(), scope.first, scope.second);
return *this;
}
slist& operator= (const std::list &list){
clear();
insert(end(), list.begin(), list.end() );
return *this;
}
slist& operator= (const SLIST &ele){
clear();
push_back(ele);
return *this;
}
slist& operator= (const std::vector &arr){
clear();
insert(end(), arr.begin(), arr.end() );
return *this;
}
void reit(){
itBeg = begin();
itEnd = end();
--itEnd;
}
void setit(const int num){
reit();
std::advance(itBeg, num);
itEnd = itBeg;
}
void setback(const int num){
itEnd = begin();
size_t i = size()-num;
std::advance(itEnd, i-1);
restsize = i;
}
void operator= (const int &num){
setit(num);
}
void operator! (void){
reit();
}
SLIST& inc(){
SLIST &iterEle = *itBeg;
++itBeg;
return iterEle;
}
SLIST& operator++ (void){
return inc();
}
SLIST& operator++ (int){
return inc();
}
SLIST& dec(){
SLIST &iterEle = *itEnd;
if(itEnd!=begin() ) --itEnd;
return iterEle;
}
SLIST& operator-- (void){
return dec();
}
SLIST& operator-- (int){
return dec();
}
};[/code]
使用例
int main(){
int nums[5]={8,5,3,7,8};
slist slis;
std::vector vec;
for(int i=0;i=演算子 引数で指定した番号(0から数えて)から取り出すよう指定します。
・setback()関数/<=演算子 後ろから何番目(0から数えて)の要素から取り出すかを指定します。また、この関数を
使って位置を指定した場合に限り、restsizeというメンバ変数が有効になります。これ
で--演算を使う場合に、for(int i=0;i<slis.restsize;i++)--slis;
などとすれば、最後の要素までを取り出せます。