【文件属性】:
文件名称:SGI-STL 源码以及 word 注解版
文件大小:2.07MB
文件格式:RAR
更新时间:2012-10-24 10:45:52
STL sgi
#include
#ifndef _RWSTD_NO_NAMESPACE
namespace std {
#endif
//
// Forward declare raw_storage_iterator
//
template
class raw_storage_iterator;
//
// Non-modifying sequence operations.
//
template
Function for_each (InputIterator first, InputIterator last, Function f)
{
while (first != last) f(*first++);
return f;
}
template
InputIterator find (InputIterator first, InputIterator last, const T& value)
{
while (first != last && *first != value)
++first;
return first;
}
template
InputIterator find_if (InputIterator first, InputIterator last, Predicate pred)
{
while (first != last && !pred(*first)) ++first;
return first;
}
template
ForwardIterator1 __find_end (ForwardIterator1 first1,
ForwardIterator1 last1,
ForwardIterator2 first2,
ForwardIterator2 last2,
Distance*)
{
Distance d, d2;
__initialize(d,Distance(0));
__initialize(d2,Distance(0));
distance(first2,last2,d);
if (!d)
return first1;
distance(first1,last1,d2);
ForwardIterator1 save = last1;
while (d2 >= d)
{
if (equal(first2,last2,first1))
save = first1;
__initialize(d2,Distance(0));
distance(++first1,last1,d2);
}
return save;
}
template
ForwardIterator1 find_end (ForwardIterator1 first1,
ForwardIterator1 last1,
ForwardIterator2 first2,
ForwardIterator2 last2)
{
return __find_end(first1,last1,first2,last2,
__distance_type(first1));
}
template
ForwardIterator1 __find_end (ForwardIterator1 first1,
ForwardIterator1 last1,
ForwardIterator2 first2,
ForwardIterator2 last2,
BinaryPredicate pred,
Distance*)
{
Distance d, d2;
__initialize(d,Distance(0));
__initialize(d2,Distance(0));
distance(first2,last2,d);
if (!d)
return first1;
distance(first1,last1,d2);
ForwardIterator1 save = last1;
while (d2 >= d)
{
if (equal(first2,last2,first1,pred))
save = first1;
__initialize(d2,Distance(0));
distance(++first1,last1,d2);
}
return save;
}
template
ForwardIterator1 find_end (ForwardIterator1 first1,
ForwardIterator1 last1,
ForwardIterator2 first2,
ForwardIterator2 last2,
BinaryPredicate pred)
{
return __find_end(first1,last1,first2,last2,
pred,__distance_type(first1));
}
template
ForwardIterator1 find_first_of (ForwardIterator1 first1, ForwardIterator1 last1,
ForwardIterator2 first2, ForwardIterator2 last2)
{
if (first2 == last2)
return first1;
ForwardIterator1 next = first1;
while (next != last1)
{
if (find(first2,last2,*next) != last2)
return next;
next++;
}
return last1;
}
template
ForwardIterator1 find_first_of (ForwardIterator1 first1,ForwardIterator1 last1,
ForwardIterator2 first2,ForwardIterator2 last2,
BinaryPredicate pred)
{
if (first2 == last2)
return first1;
ForwardIterator1 next = first1;
while (next != last1)
{
if (find_if(first2,last2,bind2nd(pred,*next)) != last2)
return next;
next++;
}
return last1;
}
template
ForwardIterator adjacent_find (ForwardIterator first, ForwardIterator last)
{
if (first == last) return last;
ForwardIterator next = first;
while (++next != last)
{
if (*first == *next) return first;
first = next;
}
return last;
}
template
ForwardIterator adjacent_find (ForwardIterator first, ForwardIterator last,
BinaryPredicate binary_pred)
{
if (first == last) return last;
ForwardIterator next = first;
while (++next != last)
{
if (binary_pred(*first, *next)) return first;
first = next;
}
return last;
}
#ifndef _RWSTD_NO_CLASS_PARTIAL_SPEC
template
_TYPENAME iterator_traits::difference_type
count (InputIterator first, InputIterator last, const T& value)
{
typename iterator_traits::difference_type n = 0; //RW_BUG: fix for bts-42842
while (first != last)
if (*first++ == value) ++n;
return n;
}
template
_TYPENAME iterator_traits::difference_type
count_if (InputIterator first, InputIterator last, Predicate pred)
{
typename iterator_traits::difference_type n = 0; //RW_BUG: fix for bts-42842
while (first != last)
if (pred(*first++)) ++n;
return n;
}
#endif /* _RWSTD_NO_CLASS_PARTIAL_SPEC */
#ifndef _RWSTD_NO_OLD_COUNT
template
void count (InputIterator first, InputIterator last, const T& value, Size& n)
{
while (first != last)
if (*first++ == value) ++n;
}
template
void count_if (InputIterator first, InputIterator last, Predicate pred,
Size& n)
{
while (first != last)
if (pred(*first++)) ++n;
}
#endif /* _RWSTD_NO_OLD_COUNT */
template
pair mismatch(InputIterator1 first1,
InputIterator1 last1,
InputIterator2 first2)
{
while (first1 != last1 && *first1 == *first2)
{
++first1;
++first2;
}
pair tmp(first1, first2);
return tmp;
}
template
pair mismatch (InputIterator1 first1,
InputIterator1 last1,
InputIterator2 first2,
BinaryPredicate binary_pred)
{
while (first1 != last1 && binary_pred(*first1, *first2))
{
++first1;
++first2;
}
pair tmp(first1, first2);
return tmp;
}
template
ForwardIterator1 __search (ForwardIterator1 first1, ForwardIterator1 last1,
ForwardIterator2 first2, ForwardIterator2 last2,
Distance1*, Distance2*)
{
Distance1 d1;
__initialize(d1, Distance1(0));
distance(first1, last1, d1);
Distance2 d2;
__initialize(d2, Distance2(0));
distance(first2, last2, d2);
if (d1 < d2) return last1;
ForwardIterator1 current1 = first1;
ForwardIterator2 current2 = first2;
while (current2 != last2)
{
if (*current1++ != *current2++)
if (d1-- == d2)
return last1;
else
{
current1 = ++first1;
current2 = first2;
}
}
return (current2 == last2) ? first1 : last1;
}
template
ForwardIterator1 __search (ForwardIterator1 first1, ForwardIterator1 last1,
ForwardIterator2 first2, ForwardIterator2 last2,
BinaryPredicate binary_pred, Distance1*, Distance2*)
{
Distance1 d1;
__initialize(d1, Distance1(0));
distance(first1, last1, d1);
Distance2 d2;
__initialize(d2, Distance2(0));
distance(first2, last2, d2);
if (d1 < d2) return last1;
ForwardIterator1 current1 = first1;
ForwardIterator2 current2 = first2;
while (current2 != last2)
{
if (!binary_pred(*current1++, *current2++))
if (d1-- == d2)
return last1;
else
{
current1 = ++first1;
current2 = first2;
}
}
return (current2 == last2) ? first1 : last1;
}
template
ForwardIterator __search_n (ForwardIterator first, ForwardIterator last,
Distance*, Size count, const T& value)
{
Distance d;
__initialize(d, Distance(0));
distance(first, last, d);
if (d < count || count <= 0) return last;
Distance span = d - count;
Size matches = 0;
ForwardIterator current = first;
while (current != last)
{
if (*current++ != value)
{
if (span < matches + 1)
return last;
span -= matches + 1;
matches = 0;
first = current;
}
else
if (++matches == count)
return first;
}
return last;
}
template
ForwardIterator __search_n (ForwardIterator first, ForwardIterator last,
Distance*, Size count, const T& value,
BinaryPredicate pred)
{
Distance d;
__initialize(d, Distance(0));
distance(first, last, d);
if (d < count || count <= 0) return last;
Distance span = d - count;
Size matches = 0;
ForwardIterator current = first;
while (current != last)
{
if (!pred(*current++, value))
{
if (span < matches + 1)
return last;
span -= matches + 1;
matches = 0;
first = current;
}
else
if (++matches == count)
return first;
}
return last;
}
//
// Modifying sequence operations.
//
template
OutputIterator copy (InputIterator first, InputIterator last,
OutputIterator result)
{
while (first != last) *result++ = *first++;
return result;
}
template
BidirectionalIterator2 copy_backward (BidirectionalIterator1 first,
BidirectionalIterator1 last,
BidirectionalIterator2 result)
{
while (first != last) *--result = *--last;
return result;
}
template
ForwardIterator2 swap_ranges (ForwardIterator1 first1, ForwardIterator1 last1,
ForwardIterator2 first2)
{
while (first1 != last1) iter_swap(first1++, first2++);
return first2;
}
template
OutputIterator transform (InputIterator first, InputIterator last,
OutputIterator result, UnaryOperation op)
{
while (first != last) *result++ = op(*first++);
return result;
}
template
OutputIterator transform (InputIterator1 first1, InputIterator1 last1,
InputIterator2 first2, OutputIterator result,
BinaryOperation binary_op)
{
while (first1 != last1) *result++ = binary_op(*first1++, *first2++);
return result;
}
template
void replace (ForwardIterator first, ForwardIterator last, const T& old_value,
const T& new_value)
{
while (first != last)
{
if (*first == old_value) *first = new_value;
++first;
}
}
template
void replace_if (ForwardIterator first, ForwardIterator last, Predicate pred,
const T& new_value)
{
while (first != last)
{
if (pred(*first)) *first = new_value;
++first;
}
}
template
OutputIterator replace_copy (InputIterator first, InputIterator last,
OutputIterator result, const T& old_value,
const T& new_value)
{
while (first != last)
{
*result++ = *first == old_value ? new_value : *first;
++first;
}
return result;
}
template
OutputIterator replace_copy_if (Iterator first, Iterator last,
OutputIterator result, Predicate pred,
const T& new_value)
{
while (first != last)
{
if(pred(*first))
*result++ = new_value;
else
*result++ = *first;
++first;
}
return result;
}