STLÓ¦ÓÃƪ ÁªÏµ¿Í·þ

·¢²¼Ê±¼ä : ÐÇÆÚ¶þ ÎÄÕÂSTLÓ¦ÓÃƪ¸üÐÂÍê±Ï¿ªÊ¼ÔĶÁ3a18734ee518964bcf847cf8

1£® ¸ÅÊö

·ºÐͱà³Ì˼Ïë×îÔçÔµÓÚA.StepanovÌá³öµÄ²¿·ÖËã·¨¿É¶ÀÁ¢ÓÚÊý¾Ý½á¹¹µÄÂ۶ϡ£20ÊÀ¼Í90Äê´ú³õA.StepanovºÍMeng Lee¸ù¾Ý·ºÐͱà³ÌµÄÀíÂÛÓÃC++¹²Í¬±àдÁËSTL¡£µ«Ö±ÖÁ1998Ä꣬STL²Å³ÉΪC++µÄÕýʽ±ê×¼¡£ÔÚºóÀ´µÄ¼¸ÄêÖУ¬¸÷´óÖ÷Á÷±àÒëÆ÷Ò²¶¼Ïà¼Ì¼ÓÈëÁ˶ÔSTLµÄÖ§³Ö£¬ÖÁ´ËSTL²Å¿ªÊ¼µÃµ½¹ã·ºµÄÓ¦Óá£

STLÌåÏÖµÄÊÇ·ºÐͱà³ÌµÄºËÐÄ˼Ï룺¶ÀÁ¢Êý¾Ý½á¹¹ºÍËã·¨(ÕâÊÇÒ»ÖÖ¶ÀÁ¢ÓÚOOµÄ±à³ÌÕÜѧ)¡£STLÖ÷ÒªÓɼ¸¸öºËÐIJ¿¼þ×é³É£¬¼´µü´úÆ÷¡¢ÈÝÆ÷¡¢Ëã·¨¡¢º¯Êý¶ÔÏó¡¢ÊÊÅäÆ÷¡£ÈÝÆ÷¼´ÎïÖ®ËùÊô£»Ëã·¨Êǽâ¾öÎÊÌâµÄ·½Ê½£»µü´úÆ÷ÊǶÔÈÝÆ÷µÄ·ÃÎÊÂß¼­µÄ³éÏó£¬ÊÇÁ¬½ÓËã·¨ºÍÈÝÆ÷µÄŦ´ø£»µü´úÆ÷ͨ¹ýÌí¼ÓÁËÒ»ÖÖ¼ä½Ó²ãµÄ·½Ê½ÊµÏÖÁËÈÝÆ÷ºÍËã·¨Ö®¼äµÄ¶ÀÁ¢£»º¯Êý¶ÔÏ󣬾ÍÊÇÖØÔØÁËoperator()²Ù×÷·ûµÄ¶ÔÏó£»ÊÊÅäÆ÷ÊÇͨ¹ý×éºÏÌض¨µÄÈÝÆ÷ʵÏÖµÄÒ»ÖÖеÄÊý¾Ý½á¹¹¡£ÔÚºóÐøµÄÄÚÈÝÖУ¬ÎÒÃǽ«¶Ô¼¸¸öºËÐIJ¿¼þµÄ»ù´¡Ó¦ÓýøÐÐÏêϸµÄÃèÊö¡£

2£® »ù´¡

C++²úÉúµÄÀúÊ·±³¾°¸³ÓèÁËC++Ì«¶àµÄÖ°Ô𣬱ÈÈç¼æÈÝC¡¢×ۺϵıà³ÌÓïÑԵȣ¬ÕâЩËäÈ»¸³ÓèÁËC++Ç¿´óµÄ¹¦ÄÜ£¬µ«Í¬Ê±Ò²ÈÓ¸øÁ˼«´óµÄ¸´ÔӶȡ£ÔÚÕâƪÎÄÕÂÖУ¬ÎÒÃDz¢²»´òË㽫Äã´øÈëC++µÄ¸´Ôӵشø£¬µ«ÊÇÐèÒªÄãÓÐÒ»¶¨µÄC++»ù´¡£¬±ÈÈçÀà¡¢½á¹¹µÈ¡£

STLÉîÉîµØÖ²¸ùÓÚC++µÄ»ù´¡ÉèÊ©£¬ÕâÆäÖаüÀ¨ÁËÄÚÁª¡¢º¯Êý¶ÔÏ󡢺¯ÊýÄ£°å¡¢ÀàÄ£°åµÈ¡£

2.1. ÄÚÁª

ÄÚÁªÊÇC++ÖÐÒ»ÖÖÌØÊâµÄÓïÑÔ»úÖÆ£¬Ê¹ÓÃinlineÀ´±êʶ¡£C++ÔÚ±àÒëinline±êʶµÄº¯Êýʱ£¬½«¸ù¾ÝÌض¨µÄ¹æÔò½«inlineº¯ÊýµÄ´úÂëÖ±½Ó²åÈëµ½inlineº¯ÊýµÄµ÷ÓÃλÖã¬ÒÔ´ËÀ´Ìá¸ß³ÌÐòµÄÔËÐÐЧÂÊ£¬µ«Í¬Ê±Ò²ÔÚÒ»¶¨³Ì¶ÈÉϵ¼ÖÂÁË´úÂëµÄÅòÕÍ¡£Çë¿´ÏÂÃæµÄÀý×Ó£º

inlineÈ«¾Öº¯Êý

inline void max{?};

inline³ÉÔ±º¯Êý class A{

public:

inline void max{?}; }

2.2. º¯Êý¶ÔÏó

º¯Êý¶ÔÏ󣬾ÍÊÇÖØÔØÁËoperator()²Ù×÷·ûµÄ¶ÔÏó¡£Ïà¶Ôº¯ÊýÖ¸Õ룬º¯Êý¶ÔÏó¿ÉÒÔ¾ßÓÐ״̬£¬¸ü°²È«£¬¸üÁé»î£¬»ù±¾Ã»ÓжîÍâµÄ¿ªÏú¡£ÔÚSTLÖУ¬º¯Êý¶ÔÏó¾­³£±»ÓÃ×÷Ëã·¨µÄÊäÈë²ÎÊý»òÈÝÆ÷µÄʵÀý»¯µÄ²ÎÊý¡£Çë¿´ÏÂÃæµÄÀý×Ó£º

¶¨Ò庯Êý¶ÔÏóÀà classs LessThan{

public:

LessThan(int val): m_val(val){}

bool operator()(int val){return m_val < val;} private: int m_val; };

¶¨Ò庯Êý¶ÔÏó

LessThan less(5);

µ÷Óö¨Ò庯Êý¶ÔÏó

less(10);//·µ»ØΪtrue 2.3. º¯ÊýÄ£°å

C++ÖеÄÄ£°åÊÇSTLʵÏֵļ¼Êõ»ù´¡¡£C++ÖеÄÄ£°å¿É·ÖΪº¯ÊýÄ£°åºÍÀàÄ£°å¡£º¯ÊýÄ£°å³éÏóÁËÕë¶Ô²»Í¬ÀàÐ͵ÄͬһÐÔÖʵIJÙ×÷¡£ÈçÕë¶Ôint/long/stringµÄmax²Ù×÷¡£Çë¿´ÏÂÃæµÄÀý×Ó£º

¶¨ÒåÇóÈ¡Á½¸öÀàÐ͵ÄÖµ»ò¶ÔÏóµÄ×î´óÖµµÄ²Ù×÷

template

T max(T a,T b){return a>b ? a : b;} ÇóÈ¡Á½¸öintÖµµÄ×î´óÖµ max(0,10);//·µ»Ø10

ÇóÈ¡Á½¸östring¶ÔÏóµÄ×î´óÖµ

max(string(¡°Hello¡±),string(¡°world¡±));//·µ»Østring(¡°world¡±) 2.4. ÀàÄ£°å

C++ÖеÄÄ£°åÊÇSTLʵÏֵļ¼Êõ»ù´¡¡£C++ÖеÄÄ£°å¿É·ÖΪº¯ÊýÄ£°åºÍÀàÄ£°å¡£ÀàÄ£°å³éÏóÁËÕë¶Ô²»Í¬ÀàÐ͵ÄͬһÀàÊÂÎñ¡£ÈçÕë¶Ôint/long/stringµÄStack¡£Çë¿´ÏÂÃæµÄÀý×Ó£º

¶¨ÒåÒ»¸öͨÓöÑÕ»Stack template class Stack{

public:

inline void push(const T& value){?} T pop(){?}

void clear(){?}

bool empty() const {?} };

ÉùÃ÷Ò»¸öintÀàÐ͵ÄStack typdef Stack IntStack; ÉùÃ÷Ò»¸östringÀàÐ͵ÄStack typdef Stack IntStack;

3£® µü´úÆ÷

STLÖеĵü´úÆ÷ÊÇC++Ö¸ÕëµÄ·º»¯£¬ËüÔÚËã·¨ºÍÈÝÆ÷Ö®¼ä³äµ±Ò»¸öÖмä²ã£¬Îª´¦Àí²»Í¬µÄÊý¾Ý½á¹¹ÌṩÁËÒ»Öµķ½Ê½¡£µü´úÆ÷Ò²¿ÉÒÔ¿´×÷ÊǶÔÈÝÆ÷Êý¾Ý½á¹¹·ÃÎʵÄÒ»ÖÖÔ¼Êø¡£STLÖеĵü´úÆ÷¿É·ÖΪÀࣺËæ»ú´æÈ¡µü´úÆ÷£¨random-access-iterator£©£¬Ë«Ïò´æÈ¡µü´úÆ÷(bidirectional-access-iterator)£¬Ç°Ïòµü´úÆ÷(forward iterator)£¬ÊäÈëµü´úÆ÷(input-iterator)£¬Êä³öµü´úÆ÷(output-iterator)¡£ËüÃÇÖ®¼äµÄ¼Ì³Ð¹ØϵÈçÏÂͼ£º

input-iterator

output-iteartor

forward-iterator:output-iteartor , input-iterator bidirectional-access-iterator : forward-iterator

random-access-iterator:bidirectional-access-iterator

ͼһ µü´úÆ÷¹Øϵͼ

3.1. ÊäÈëµü´úÆ÷

ÊäÈëµü´úÆ÷Ò²¿ÉÒÔ³Æ֮ΪǰÏòµÄÖ»¶Á·ÃÎÊÆ÷£¬Ê×ÏÈËüÌṩÁ˶ÔÈÝÆ÷µÄÖ»¶Á·ÃÎÊ£¬Æä´ÎËüÖ»ÄÜÔÚÈÝÆ÷ÖнøÐÐÇ°Ïòµü´ú£¨¼´Ö»Ìṩ++²Ù×÷£©¡£ËùÓеÄÈÝÆ÷µÄµü´úÆ÷¶¼¾ßÓÐÊäÈëµü´úÆ÷µÄÌØÕ÷¡£Í¨¹ýÊäÈëµü´úÆ÷Äã¿ÉÒÔ½øÐÐÏÂÃæÈýÖÖ²Ù×÷£º

1.V = *X++ 2.V = *X,X++

3.V = *X,++X

×¢£ºVΪֵ£¬XΪµü´úÆ÷

3.2. Êä³öµü´úÆ÷

Êä³öµü´úÆ÷Ò²¿ÉÒÔ³Æ֮ΪǰÏòµÄֻд·ÃÎÊÆ÷£¬Ê×ÏÈËüÌṩÁ˶ÔÈÝÆ÷µÄֻд·ÃÎÊ£¬Æä´ÎËüÖ»ÄÜÔÚÈÝÆ÷ÖнøÐÐÇ°Ïòµü´ú£¨¼´Ö»Ìṩ++²Ù×÷£©¡£Í¨¹ýÊä³öµü´úÆ÷Äã¿ÉÒÔ½øÐÐÏÂÃæÈýÖÖ²Ù×÷£º

1.*X++ = V 2.*X = V, X++

3.*X = V, ++X

×¢£ºVΪֵ£¬XΪµü´úÆ÷

3.3. Ç°Ïòµü´úÆ÷

Ç°Ïòµü´úÆ÷¼Ì³Ð×ÔÊäÈëºÍÊä³öµü´úÆ÷£¬Òò´Ë¾ßÓÐÊäÈëºÍÊä³öµü´úÆ÷µÄËùÓÐÌØÕ÷£¬Ò²¼´Ìṩ¶ÔÈÝÆ÷Êý¾Ý½á¹¹µÄ¶Áд·ÃÎʵ«Ò²Ö»¾ßÓÐÇ°Ïòµü´úµÄÄÜÁ¦£¨¼´Ö»Ìṩ++²Ù×÷£©¡£Òò´Ë£¬Äã¿ÉÒÔ¶ÔÇ°Ïòµü´úÆ÷½øÐвÙ×÷£ºR == S /++R == ++S¡£ Çë¿´ÏÂÃæµÄÀý×Ó£º

¶¨ÒåÒ»¸öÀûÓÃÇ°Ïòµü´úÆ÷½øÐÐÏßÐÔ²éÕÒµÄËã·¨

template ForwardIterator linear_search(ForwardIterator last,const T& value)

{

for (; first != last; ++first){

if (*first == value) return first; }

return last; }

²âÊÔ

int ia[] = {35,3,23};

vector vec(ia,ia+3);

vector::iterator it = linear_search(vec.begin(),vec.end(),100); if (it != vec.end())

std::cout << \else

std::cout << \²âÊÔ½á¹ûΪ£ºNot Found

3.4. Ë«Ïò´æÈ¡µü´úÆ÷

Ë«Ïò´æÈ¡µü´úÆ÷´ÓÇ°Ïòµü´úÆ÷¼Ì³Ð¹ýÀ´£¬Òò¶ø¾ßÓÐÇ°Ïòµü´úÆ÷µÄËùÓÐÌØÕ÷£¬Ë«Ïò´æÈ¡µü´úÆ÷»¹¾ßÓкóÏò·ÃÎÊÄÜÁ¦£¨¼´Ö»Ìṩ--²Ù×÷£©¡£Çë¿´ÏÂÃæµÄÀý×Ó£º ¶¨ÒåÒ»¸öÀûÓÃË«Ïòµü´úÆ÷ÅÅÐòËã·¨

template

first,ForwardIterator

void sort_me(BidirectionalIterator first,BidirectionalIterator last,Compare comp)

{

for(BidirectionalIterator i = first; i != last; ++i) {

BidirectionalIterator _last = last; while(i != _last--) {

if (comp(*i,*_last)) iter_swap(i,_last); } } } ²âÊÔ

int ia[] = {123,343,12,100,343,5,5}; vector vec(ia,ia+7);

sort_me(vec.begin(),vec.end(),less());

copy(vec.begin(),vec.end(),ostream_iterator(cout,\std::cout << endl;

²âÊÔ½á¹ûΪ£º5 5 12 100 123 343 343 3.5. Ëæ»ú´æÈ¡µü´úÆ÷

Ëæ»ú´æÈ¡µü´úÆ÷´ÓË«Ïò´æÈ¡µü´úÆ÷¼Ì³Ð¹ýÀ´£¬Òò¶ø¾ßÓÐË«Ïò´æÈ¡µü´úÆ÷µÄËùÓÐÌØÕ÷¡£Ëù²»Í¬µÄÊÇ£¬ÀûÓÃËæ»ú´æÈ¡µü´úÆ÷Äã¿ÉÒÔ¶ÔÈÝÆ÷Êý¾Ý½á¹¹½øÐÐËæ»ú·ÃÎÊ£¬Òò¶øËæ»ú´æÈ¡µü´úÆ÷»¹¿ÉÒÔ¶¨ÒåÏÂÃæµÄ²Ù×÷£º

1.operator+(int)

2.operator+=(int) 3.operator-(int)

4.operator-=(int) 5.operator[](int)

6.operator-(random-access-iterator) 7.operator>(random-access-iterator) 8.operator<(random-access-iterator) 9.operator>=(random-access-iterator) 10.operator<=(random-access-iterator)

ÔÚSTLÖУ¬Ëæ»ú´æÈ¡Ë«Ïòµü´úÆ÷Ö»ÄÜ×÷ÓÃÓÚ˳ÐòÈÝÆ÷¡£Çë¿´ÏÂÃæµÄÀý×Ó£º ²âÊÔÊä³övectorÀïÃæµÄÊý¾Ý

int ia[] = {123,343,12,100,343,5,5}; vector vec(ia,ia+7);

for(int i = 0; i < vec.size(); ++i) std::cout << vec[i] << \²âÊÔ½á¹ûΪ£º123 343 12 100 343 5 5

4£® ÈÝÆ÷

ÈÝÆ÷¼´ÎïÖ®ËùÔÚ¡£ÈÝÆ÷ÊÇSTLµÄºËÐIJ¿¼þÖ®Ò»£¬Êǵü´úÆ÷µÄÒÀ¸½£¬ÊÇËã·¨×÷ÓõÄÄ¿±ê¡£