📄 deque
字号:
if (_Iter_container(_First) != this)
clear();
size_type _Oldsize = size();
for (; _First != _Last; ++_First)
push_back((value_type)*_First); // append new stuff
for (; 0 < _Oldsize; --_Oldsize)
pop_front(); // erase any leftover old stuff
}
template<typename _InIt_t>
void insert(iterator _Where, _InIt_t _First, _InIt_t _Last)
{ // insert [_First, _Last) at _Where
_Insert(get_bias(_Where), _First, _Last,
_Iter_category(_First));
}
template<typename _InIt_t>
void _Insert(size_type _Where, _InIt_t _First, _InIt_t _Last,
_Int_iterator_tag%)
{ // insert _Count * _Val at _Where
insert_n(_Where, (size_type)_First, (value_type)_Last);
}
template<typename _InIt_t>
void _Insert(size_type _Where, _InIt_t _First, _InIt_t _Last,
input_iterator_tag%)
{ // insert [_First, _Last) at _Where, input iterators
if (!valid_bias(_Where))
throw gcnew System::InvalidOperationException();
if (_First == _Last)
;
else if (_Where - begin_bias() < end_bias() - _Where)
{ // add elements near beginning
size_type _Oldfirst = begin_bias();
for (; _First != _Last; ++_First)
push_front((value_type)*_First); // prepend flipped
if (_Oldfirst != _Where)
{ // insert not at beginning, flip new stuff into place
reverse_n(_Oldfirst, _Where);
reverse_n(begin_bias(), _Where);
}
else
reverse_n(begin_bias(), _Oldfirst); // flip new stuff in place
}
else
{ // add elements near end
size_type _Oldlast = end_bias();
for (; _First != _Last; ++_First)
push_back((value_type)*_First); // append
if (_Oldlast != _Where)
{ // insert not at end, flip new stuff into place
reverse_n(_Where, _Oldlast);
reverse_n(_Oldlast, end_bias());
reverse_n(_Where, end_bias());
}
}
}
// interfaces
private:
property size_type Count_generic
{ // element count
virtual size_type get() sealed
= System::Collections::Generic::ICollection<_Value_t>::Count::get
{ // get element count
return (size());
}
};
property bool IsReadOnly
{ // test if read only
virtual bool get() sealed
= System::Collections::Generic::ICollection<_Value_t>
::IsReadOnly::get
{ // test if read only
return (false);
}
};
virtual void CopyTo(_Myarray_t^ _Dest, int _First) sealed
= System::Collections::Generic::ICollection<_Value_t>::CopyTo
{ // copy to _Dest, beginning at _First
for (int _Idx = size(); 0 <= --_Idx; )
{ // copy back to front
_Dest[_First + _Idx] = _Mymake_t::make_value(at(_Idx));
}
}
virtual System::Collections::Generic::IEnumerator<_Value_t>^
GetEnumerator() sealed
= System::Collections::Generic::IEnumerable<_Value_t>::GetEnumerator
{ // get enumerator for the container
return (gcnew _STLCLR DequeEnumerator<_Value_t>(this, begin_bias()));
}
virtual void Add(value_type _Val) sealed
= System::Collections::Generic::ICollection<_Value_t>::Add
{ // add element with value _Val
insert_n(begin_bias() + size(), 1, _Val);
}
virtual void Clear() sealed
= System::Collections::Generic::ICollection<_Value_t>::Clear
{ // erase all elements
clear();
}
virtual bool Contains(value_type _Val) sealed
= System::Collections::Generic::ICollection<_Value_t>::Contains
{ // search for element matching value _Val
for (size_type _Idx = 0; _Idx != size(); ++_Idx)
if (((System::Object^)_Val)->Equals(
(System::Object^)at(_Idx)))
return (true);
return (false);
}
virtual bool Remove(value_type _Val) sealed
= System::Collections::Generic::ICollection<_Value_t>::Remove
{ // remove first element matching value _Val
for (size_type _Idx = 0; _Idx != size(); ++_Idx)
if (((System::Object^)_Val)->Equals(
(System::Object^)at(_Idx)))
{ // found a match, remove it
size_type _Bias = begin_bias() + _Idx;
erase_n(_Bias, _Bias + 1);
return (true);
}
return (false);
}
virtual int IndexOf(value_type _Val) sealed
= System::Collections::Generic::IList<_Value_t>::IndexOf
{ // find index of element that matches _Val
int _Idx = 0;
for (; _Idx < size(); ++_Idx)
if (at(_Idx) == _Val)
return (_Idx);
return (-1);
}
virtual void Insert(int _Idx, value_type _Val) sealed
= System::Collections::Generic::IList<_Value_t>::Insert
{ // insert _Val before _Idx
insert_n(begin_bias() + _Idx, 1, _Val);
}
virtual void RemoveAt(int _Idx) sealed
= System::Collections::Generic::IList<_Value_t>::RemoveAt
{ // erase element at _Idx
erase_n(begin_bias() + _Idx, begin_bias() + _Idx + 1);
}
};
//
// TEMPLATE CLASS deque_select
//
template<typename _Value_t,
bool _Is_ref>
ref class deque_select
: public deque_base<_Value_t, _Is_ref>
{ // double-ended queue of elements
public:
// types
typedef _Value_t _Gvalue_t;
typedef deque_select<_Value_t, _Is_ref> _Mytype_t;
typedef deque_base<_Gvalue_t, _Is_ref> _Mybase_t;
// typedef _STLCLR IDeque<_Gvalue_t> _Mycont_it;
// typedef System::Collections::Generic::IEnumerable<_Gvalue_t> _Myenum_it;
// typedef int size_type;
// typedef int difference_type;
typedef _Value_t value_type;
typedef value_type% reference;
typedef value_type% const_reference;
// typedef _Mycont_it generic_container;
// typedef typename _Mybase_t::value_type generic_value;
// basics
deque_select()
: _Mybase_t()
{ // construct default
}
deque_select(deque_select% _Right)
: _Mybase_t(_Right)
{ // construct by copying a deque
}
deque_select% operator=(deque_select% _Right)
{ // assign
_Mybase_t::operator=(_Right);
return (*this);
}
// constructors
explicit deque_select(size_type _Count)
: _Mybase_t(_Count)
{ // construct from _Count * value_type()
}
deque_select(size_type _Count, value_type _Val)
: _Mybase_t(_Count, _Val)
{ // construct from _Count * _Val
}
template<typename _InIt_t>
deque_select(_InIt_t _First, _InIt_t _Last)
: _Mybase_t(_First, _Last)
{ // construct from [_First, _Last)
}
deque_select(_Myenum_it^ _Right)
: _Mybase_t(_Right)
{ // initialize with enumeration
}
};
//
// TEMPLATE CLASS deque_select: _Value_t REF SPECIALIZATION
//
template<typename _Value_t>
ref class deque_select<_Value_t, true>
: public deque_base<_Value_t^, true>
{ // double-ended queue of elements
public:
// types
typedef _Value_t^ _Gvalue_t;
typedef deque_select<_Value_t, true> _Mytype_t;
typedef deque_base<_Gvalue_t, true> _Mybase_t;
// typedef _STLCLR IDeque<_Gvalue_t> _Mycont_it;
// typedef System::Collections::Generic::IEnumerable<_Gvalue_t> _Myenum_it;
// typedef int size_type;
// typedef int difference_type;
typedef _Value_t value_type;
typedef value_type% reference;
typedef value_type% const_reference;
// typedef _Mycont_it generic_container;
// typedef typename _Mybase_t::value_type generic_value;
// basics
deque_select()
: _Mybase_t()
{ // construct default
}
deque_select(deque_select% _Right)
: _Mybase_t(_Right)
{ // construct by copying a deque
}
deque_select% operator=(deque_select% _Right)
{ // assign
_Mybase_t::operator=(_Right);
return (*this);
}
// constructors
explicit deque_select(size_type _Count)
{ // construct from _Count * value_type()
resize(_Count);
}
deque_select(size_type _Count, value_type _Val)
{ // construct from _Count * _Val
resize(_Count, _Val);
}
template<typename _InIt_t>
deque_select(_InIt_t _First, _InIt_t _Last)
: _Mybase_t(_First, _Last)
{ // construct from [_First, _Last)
}
deque_select(_Myenum_it^ _Right)
: _Mybase_t(_Right)
{ // initialize with enumeration
}
// size controllers
virtual void resize(size_type _Newsize) override
{ // determine new length, padding with value_type elements
value_type _Val;
_Mybase_t::resize(_Newsize, %_Val);
}
void resize(size_type _Newsize, value_type _Val)
{ // determine new length, padding with _Val elements
_Mybase_t::resize(_Newsize, %_Val);
}
// accessors
reference at(size_type _Pos) new
{ // subscript mutable sequence with checking
return (*_Mybase_t::at(_Pos));
}
property value_type default[size_type]
{ // get or set subscripted element
virtual value_type get(size_type _Pos)
{ // get _Pos element
return (*_Mybase_t::at(_Pos));
}
virtual void set(size_type _Pos, value_type _Val)
{ // set _Pos element
_Mybase_t::at(_Pos) = gcnew value_type(_Val);
}
};
property value_type front_item
{ // get or set first element
virtual value_type get()
{ // get first element
return (*_Mybase_t::front_item);
}
virtual void set(value_type _Val)
{ // set first element
_Mybase_t::front_item = gcnew value_type(_Val);
}
};
property value_type back_item
{ // get or set last element
virtual value_type get()
{ // get last element
return (*_Mybase_t::back_item);
}
virtual void set(value_type _Val)
{ // set last element
_Mybase_t::back_item = gcnew value_type(_Val);
}
};
reference front() new
{ // get first element of mutable sequence
return (*_Mybase_t::front());
}
reference back() new
{ // get last element of mutable sequence
return (*_Mybase_t::back());
}
// mutators
void push_front(value_type _Val)
{ // insert element at beginning
_Mybase_t::push_front(%_Val);
}
void push_back(value_type _Val)
{ // insert element at end
_Mybase_t::push_back(%_Val);
}
void assign(size_type _Count, value_type _Val)
{ // assign _Count * _Val
_Mybase_t::assign(_Count, %_Val);
}
iterator insert(iterator _Where, value_type _Val)
{ // insert _Val at _Where
return (_Mybase_t::insert(_Where, %_Val));
}
void insert(iterator _Where,
size_type _Count, value_type _Val)
{ // insert _Count * _Val at _Where
return (_Mybase_t::insert(_Where, _Count, %_Val));
}
};
} // namespace cliext::impl
//
// TEMPLATE CLASS deque
//
template<typename _Value_t>
ref class deque
: public impl::deque_select<_Value_t,
__is_ref_class(typename _Dehandle<_Value_t>::type)
&& !is_handle<_Value_t>::value>
{ // double-ended queue of elements
public:
// types
typedef deque<_Value_t> _Mytype_t;
typedef impl::deque_select<_Value_t,
__is_ref_class(typename _Dehandle<_Value_t>::type)
&& !is_handle<_Value_t>::value> _Mybase_t;
// typedef _STLCLR IDeque<_Value_t> _Mycont_it;
// typedef int size_type;
// typedef int difference_type;
// typedef _Value_t value_type;
// typedef value_type% reference;
// typedef value_type% const_reference;
// typedef _Mycont_it generic_container;
// typedef value_type generic_value;
// basics
deque()
: _Mybase_t()
{ // construct default
}
deque(deque% _Right)
: _Mybase_t((_Mybase_t%)_Right)
{ // construct by copying a deque
}
deque(deque^ _Right)
: _Mybase_t((_Mybase_t%)*_Right)
{ // construct by copying a deque
}
deque% operator=(deque% _Right)
{ // assign
_Mybase_t::operator=(_Right);
return (*this);
}
deque% operator=(deque^ _Right)
{ // assign
_Mybase_t::operator=(*_Right);
return (*this);
}
// constructors
explicit deque(size_type _Count)
: _Mybase_t(_Count)
{ // construct from _Count * value_type()
}
deque(size_type _Count, value_type _Val)
: _Mybase_t(_Count, _Val)
{ // construct from _Count * _Val
}
template<typename _InIt_t>
deque(_InIt_t _First, _InIt_t _Last)
: _Mybase_t(_First, _Last)
{ // construct from [_First, _Last)
}
deque(_Myenum_it^ _Right)
: _Mybase_t(_Right)
{ // initialize with enumeration
}
// mutators
void swap(deque% _Right)
{ // exchange contents with _Right
_Mybase_t::swap(_Right);
}
// interfaces
virtual System::Object^ Clone() override
{ // clone the vector
return (gcnew _Mytype_t(*this));
}
};
//
// TEMPLATE COMPARISONS
//
template<typename _Value_t> inline
bool operator==(deque<_Value_t>% _Left,
deque<_Value_t>% _Right)
{ // test if _Left == _Right
deque<_Value_t>::size_type _Size = _Left.size();
if (_Size != _Right.size())
return (false);
else
{ // same length, compare elements
for (int _Idx = 0; _Idx != _Size; ++_Idx)
if (_Left.at(_Idx) != _Right.at(_Idx))
return (false);
return (true);
}
}
template<typename _Value_t> inline
bool operator!=(deque<_Value_t>% _Left,
deque<_Value_t>% _Right)
{ // test if _Left != _Right
return (!(_Left == _Right));
}
template<typename _Value_t> inline
bool operator<(deque<_Value_t>% _Left,
deque<_Value_t>% _Right)
{ // test if _Left < _Right
deque<_Value_t>::size_type _Idx = 0;
for (; _Idx != _Left.size() && _Idx != _Right.size(); ++_Idx)
if (_Left.at(_Idx) < _Right.at(_Idx))
return (true);
else if (_Right.at(_Idx) < _Left.at(_Idx))
return (false);
return (_Idx == _Left.size() && _Idx != _Right.size());
}
template<typename _Value_t> inline
bool operator>=(deque<_Value_t>% _Left,
deque<_Value_t>% _Right)
{ // test if _Left >= _Right
return (!(_Left < _Right));
}
template<typename _Value_t> inline
bool operator>(deque<_Value_t>% _Left,
deque<_Value_t>% _Right)
{ // test if _Left > _Right
return (_Right < _Left);
}
template<typename _Value_t> inline
bool operator<=(deque<_Value_t>% _Left,
deque<_Value_t>% _Right)
{ // test if _Left <= _Right
return (!(_Right < _Left));
}
//
// TEMPLATE FUNCTION std::swap
//
template<typename _Value_t> inline
void swap(deque<_Value_t>% _Left,
deque<_Value_t>% _Right)
{ // swap two deques
_Left.swap(_Right);
}
} // namespace cliext
#endif // _CLI_DEQUE_
/*
* Copyright (c) 2004-2007 by Dinkumware, Ltd. ALL RIGHTS RESERVED.
* Consult your license regarding permissions and restrictions.
V5.03:0009 */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -