From d77a5525850b958f81db31813352b0f711b1994d Mon Sep 17 00:00:00 2001 From: Mohammad Date: Sun, 14 Aug 2005 15:44:32 +0430 Subject: [PATCH] I created a brief introduction to C++ STL (this is what it was called at that time). --- STL.HHP | 32 + STL.hhc | 59 + STL.hhk | 243 +++ STL.htm | 3795 ++++++++++++++++++++++++++++++++++++++++ STL_files/image001.gif | Bin 0 -> 84 bytes STL_files/image001.jpg | Bin 0 -> 40597 bytes STL_files/image002.gif | Bin 0 -> 88 bytes STL_files/image003.gif | Bin 0 -> 88 bytes STL_files/image004.gif | Bin 0 -> 88 bytes STL_files/image005.gif | Bin 0 -> 88 bytes STL_files/image006.jpg | Bin 0 -> 52170 bytes msg.htm | 103 ++ 12 files changed, 4232 insertions(+) create mode 100644 STL.HHP create mode 100644 STL.hhc create mode 100644 STL.hhk create mode 100644 STL.htm create mode 100644 STL_files/image001.gif create mode 100644 STL_files/image001.jpg create mode 100644 STL_files/image002.gif create mode 100644 STL_files/image003.gif create mode 100644 STL_files/image004.gif create mode 100644 STL_files/image005.gif create mode 100644 STL_files/image006.jpg create mode 100644 msg.htm diff --git a/STL.HHP b/STL.HHP new file mode 100644 index 0000000..5de7c8e --- /dev/null +++ b/STL.HHP @@ -0,0 +1,32 @@ + +[OPTIONS] +Auto Index=Yes +Binary TOC=No +Binary Index=Yes +Compatibility=1.1 +Compiled File=STL.chm +Contents File=STL.hhc +Default Topic=STL.htm +Error log file=ErrorLog.log +Index File=STL.hhk +Title=C++ Standard Template Library +Display compile progress=Yes +Full-text search=Yes +Default Window=main +Default Font=Tahoma, 8 +Language=0x409 English (United States) +Create CHI file=No + +[WINDOWS] +main="C++ Standard Template Library","STL.hhc","STL.hhk","STL.htm","STL.htm",,,,,0x33520,195,0x60104E,[100,100,845,655],0xB0000,,,,,,0 + +[FILES] +STL.htm +STL_files\image001.gif +STL_files\image002.gif +STL_files\image003.gif +STL_files\image004.gif +STL_files\image005.gif +STL_files\image006.jpg + +[MERGE FILES] diff --git a/STL.hhc b/STL.hhc new file mode 100644 index 0000000..6e2aaf2 --- /dev/null +++ b/STL.hhc @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + diff --git a/STL.hhk b/STL.hhk new file mode 100644 index 0000000..266f4fd --- /dev/null +++ b/STL.hhk @@ -0,0 +1,243 @@ + + + + + + + + + + + + + + diff --git a/STL.htm b/STL.htm new file mode 100644 index 0000000..e03cffa --- /dev/null +++ b/STL.htm @@ -0,0 +1,3795 @@ + + + STL + + + + + +
+

STL

+

+  

+

سلام.

+

STL (Standard Template Library) + ، جزوي از استاندارد + C++ +مي‌باشد كه در سال 97 تصويب شد. كتابخانه STL + شامل بسياري از + كلاس‌ها +(ساختمان‌هاي داده كه در STL به آن‌ها container + مي‌گويند) و +الگوريتم‌هاي مورد نياز يك برنامه نويس مي‌باشد. همچنين ورودي و خروجي جرياني (iostream) و رشته‌ها (string) +نيز جزوي از STL مي‌باشند.

+

در اين مقاله من +سعي مي‌كنم كه قسمتي از STL را تا آنجا كه مي‌توانم +توضيح دهم. در هر مورد، براي توضيحات كاملتر، يا به MSDN +مراجعه كنيد، يا به جلد دوم كتاب Thinking In C++ +نوشته Bruce Eckel. (نسخه الكترونيكي اين +كتاب از سايت + http://www.pythoncriticalmass.com به طور رايگان قابل دريافت است)

+

در ابتدا كار را +با stream ها شروع مي‌كنيم.

+

 

+

 

+

iostream

+

 

+

جريان‌ها در C++ براي ورودي و خروجي كنسول (كيبورد و صفحه نمايش) و فايل‌ها به كار +مي‌رود. براي ورودي و خروجي كنسول از دو كلاس istream و +ostream استفاده مي‌شود كه در سر فايل <iostream> ( +نه <iostream.h> ، +اين سر فايل ديگر منسوخ شده است) تعريف شده‌اند. در ضمن همه كلاس‌ها و توابع STL در فضاس نام std تعريف شده‌اند كه براي +استفاده از آن‌ها يا بايد نام فضاي نام را قبل از نام كلاس يا شيء قرار دهيد ( +مثلاً std::vector يا std::cout ) و يا بايد با استفاده از دستور using namespace به compiler +اعلام كنيد كه از فضاي نام +  std + استفاده مي‌كنيد ( به صورت using namespace std;).

+

معمولاً شما مستقيماً +از كلاس‌هاي istream و ostream استفاده نمي‌كنيد، بلكه از دو شيء كه از اين كلاس‌ها +تعريف شده‌اند، به نام‌هاي cin و cout + استفاده مي‌كنيد. +همانطور كه مي‌دانيد، به طور معمول براي استخراج از يك جريان ورودي از عملگر +استخراج از جريان (>>) و +براي درج در يك جريان خروجي از عملگر درج در جريان (<<) + استفاده مي‌كنيم.

+

ابتدا كلاس istream را بررسي مي‌كنيم.

+

اين كلاس شامل +توابعي است كه بسياري از كارها را راحت‌تر مي‌كنند. شرح بعضي از اين توابع را مي‌بينيد:

+

 

+

istream& getline ( + char + *str, int count, + char + delim = + ‘\n’ + )

+

اين تابع، يك خط +از جريان ورودي خوانده و آن را در str ذخيره مي‌كند.

+

اين تابع به +خواندن از جريان ورودي ادامه مي‌دهد تا يكي از شرايط زير اتفاق بيفتد:

+

•   به انتهاي فايل برسد.

+

•   به كاراكتري برسد كه با delim + مشخص شده‌است (delim +مخفف delimiter به معناي جدا كننده يا حائل +است). در اين صورت اين كاراكتر از ورودي حذف مي‌شود ولي در str + درج نمي‌شود. توجه كنيد كه مقدار پيش فرض اين +پارامتر ‘\n’ + است؛ يعني اگر اين پارامتر را مشخص نكنيد، به +طور پيش فرض، خواندن در انتهاي خط متوقف مي‌شود.

+

•   مقدار count-1 + كاراكتر خوانده شود.

+

در هر صورت، به +انتهاي str + يك كاراكتر ‘\0’ + اضافه مي‌شود.

+

مثال‌هاي زير +موضوع را روشن مي‌كند:

+

#include + <iostream> +

+

 

+

using namespace std;

+

 

+

void main()

+

{

+

    +char s1[100], s2[100];

+

    +cin >> s1;

+

    +cin.getline ( +s2, 100 );

+

    +cout << "s1 += " << s1 << endl;

+

    +cout << "s2 += " << s2 << endl;

+

}

+

 

+ + + + + + + + +
+

 

+
+

 

+
+

+
+


+

+

اگر ورودي اين برنامه به اين صورت +باشد:

+

 

+

welcome, this is a line

+

 

+

آنگاه خروجي به صورت زير خواهد بود:

+

 

+

s1 = welcome,

+

s2 =  this is a line

+ + + + + + + + +
+

 

+
+

 

+
+

+
+


+

+

+  

+

علت اين است كه +عملگر استخراج از جريان، عمل خواندن را هنگام رسيدن به فضاي خالي متوقف مي‌كند، و همان‌ظور +كه توضيح داده شد، تابع getline + عمل خواندن را در انتهاي خط متوقف مي‌كند.

+

*****

+

 

+

int get ();

+

istream& get ( + char + &ch )

+

istream& get ( + char + *str, int count, + char + delim = + ‘\n’ + )

+

 

+

تابع get + ، بدون هيچ پارامتري (نوع اول)، كاراكتر بعدي را از +ورودي خوانده و برمي‌گرداند؛ درصورتي كه خواندن ممكن نباشد (مثلا در مورد فايل‌ها، +اگر به انتهاي فايل رسيده باشد) اين تابع مقدار + trails_type::eof() +را برمي‌گرداند (كه برابر -1 + است).

+

نوع دوم اين +تابع، مانند نوع اول كاراكتر بعدي را خوانده ولي آن را در ch +ذخيره مي‌كند. در صورتي كه اين تابع موفق به خواندن نشود، پرچم failbit را در شيء istream +مقدار دهي ميكند. براي بررسي مقدار اين پرچم، از تابع fail() +استفاده كنيد (در اين مورد، بعداً بيشتر توضيح داده مي‌شود) .

+

نوع سوم، دقيقاً +مانند تابع getline عمل مي‌كند با اين +تفاوت كه كاراكتر delim را از ورودي حذف نمي‌كند. +يعني اگر بعد از اينكه اين تابع، با رسيدن به delim +(مثلاً ‘\n’ ) +متوقف شد، مجداداً با همان پارامترهاي قبلي صدا شود، بدون خواندن هيچ كاراكتري بازگشت +مي‌كند، زيرا به محض آغاز عمل خوندن به كاراكتر جداكننده مي‌رسد و كاراكتر +جداكننده همچنان در ورودي باقي مي‌ماند.

+

*****

+

 

+

ignore ( + int + count = 1, + char + delim = trails_type::eof() );

+

اين تابع، به +مقدار count + كاراكتر از ورودي را حذف كرده و دور مي‌ريزد. اگر قبل +از خوانده شدن count كاراكتر، به كاراكتر +مشخص شده با delim برسد، عمل خواندن متوقف +مي‌شود. مقدار پيش فرض delim +كاراكتر EOF + (پايان فايل) است. مقدار پيش فرض count + نيز يك است. يعني استفاده از تابع ignore() بدون هيچ پارامتري، يك +كاراكتر را از ورودي حذف مي‌كند. اين تابع براي مواقعي كاربرد دارد كه تعدادي از +كاراكترها مورد نياز شما نباشد و بخواهيد آن‌ها را از ورودي حذف كنيد. مثال‌هاي +زير را در نظر بگيريد:

+

+  

+

#include + <iostream> +

+

 

+

using namespace std;

+

 

+

void main()

+

{

+

    +int i, j;

+

    +cin >> i;

+

    +cin.ignore ( +80, '\n' );

+

    +cin >> j;

+

    +cout << i << +endl << j << +endl;

+

}

+

 

+

Input:

+

12stgh dddd

+

456

+

 

+

Output:

+

12

+

456

+

 

+

--------------------

+

 

+

#include + <iostream> +

+

void main( )

+

{

+

    +using namespace +std;

+

    +char chararray[10];

+

    +cout << "Type +'abcdef': ";

+

    +cin.ignore( +5, 'c' );

+

    +cin >> chararray;

+

    +cout << chararray;

+

}

+

 

+

 

+

Input:

+

abcdef

+

 

+

Output:

+

def

+

 

+

چند تابع مفيد +ديگر نيز وجود دارند كه بيشتر براي كار با فايل‌ها به كار مي‌روند. آن‌ها را در +بخش fstream بررسي مي‌كنيم.

+

+  

+

براي كار با فايل‌ها، +از كلاس‌هاي ifstream و ofstream + استفاده مي‌شود +كه در سر فايل <fstream> +تعريف شده‌اند.

+

ابتدا به نحوه +باز كردن يك فايل و خواندن از آن مي‌پردازيم.

+

براي باز كردن يك +فايل ورودي، بايد يك شيء از كلاس ifstream +تعريف كنيم:

+

 

+

#include + <fstream> +

+

#include + <iostream> +

+

 

+

using namespace std;

+

 

+

void main()

+

{

+

    +ifstream file("c:\\1.txt");

+

    +if ( !file )

+

    +{

+

          +cout << "Error +in opening file.";

+

          +return;

+

    +}

+

 

+

...

+

...

+

}

+

 

+

و يا

+

 

+

...

+

ifstream +file;

+

file.open(filename);

+

if ( !file )

+

...

+

...

+

 

+

عملگر (!) + براي جريان‌ها به +نحوي تعريف شده است كه در صورتي كه خطايي وجود داشته باشد، مقدار + true برمي‌گردانند.

+

وقتي يك شيء از +كلاس ifstream‌ +ساخته مي‌شود، به طور پيش فرض فايل ورودي در نظر گرفته مي‌شود. راه ديگر اين است +كه شيءي از كلاس fstream + ساخته شده و سريحاً مشخص شود كه يك فايل ورودي است:

+

 

+

        +fstream file;

+

    file.open ( filename, + ios::in );

+

 

+

مي‌توان با +تركيبي از فلگ‌هاي مشخص شده در ios ، نحوه باز شدن فايل را +به صورت كامل مشخص كرد. تعدادي از اين فلگ‌ها به شرح زير است:

+

ios::in  + باز كردن فايل براي خواندن

+

ios::out + – باز كردن فايل براي نوشتن در آن ( اشاره‌گر فايل در +ابتداي فايل قرار مي‌گيرد و در صورت وجود فايل، عمل نوشتن، روي داده‌هاي قبلي +انجام مي‌شود ).

+

ios::app + باز كردن فايل براي نوشتن در انتهاي آن ( +اشاره‌گر فايل در انتهاي فايل قرار ميگيرد. توجه كنيد كه فايل بايد از قبل وجود +داشته باشد )

+

ios::trunc + – در صورت وجود فايل از قبل، محتويات آنرا پاك كرده و +اشاره‌گر فايل را در ابتداي فايل قرار مي‌دهد.

+

ios::binary +  فايل را براي ورودي و خروجي binary باز مي‌كند. در صورت مشخص نكردن اين فلگ فايل به +صورت متني باز مي‌شود و تمام محتويات فايل، هنگام خواند به صورت كاراكترهاي ASCII در محدوده مجاز (از 32 تا 127 +  به علاوه يك سري +كاراكترهاي خاص مثل ‘\n’ و +‘\r’ ) +در نظر گرفته مي‌شود.

+

 

+

اين فلگ‌ها را مي‌توان +به صورت تركيبي نيز به كار برد؛ به مثال زير توجه كنيد كه فايل 1.txt را براي خواندن و نوشتن +باز مي‌كند و در صورت وجود فايل از قبل، محتويات قبلي آن را پاك مي‌كند:

+

 

+

#include + <fstream> +

+

#include + <iostream> +

+

 

+

using namespace std;

+

 

+

void main()

+

{

+

    +fstream file;

+

    +file.open ( +"c:\\1.txt", +ios::in | +ios::out | +ios::trunc );

+

    +if ( !file )

+

    +{

+

          +cout << "Error +in opnenin file." << endl;

+

          +return;

+

    +}

+

 

+

    +file << "This +is the beginnig of the file.";

+

    +// move the file pointer back 9 characters

+

    +file.seekg ( +-9, ios::end );

+

    +char s[20];

+

    +file >> s;

+

    +cout << s;

+

 

+

    +file.close();

+

}

+

 

+

Output:

+

the

+


+
در اين مثال، يك متن در فايل +نوشته شده‌است و سپس اشاره گر خواندن فايل، 9 كاراكتر به عقب برگردانده شده است و +يك رشته از فايل خوانده شده‌است. كار تابع seekg، جابجا +كردن اشاره‌گر خواندن فايل است؛ پارامتر‌هاي اين تابع به شرح زير مي‌باشد:

+

seekg ( + int + offset, ios::seekdir way );

+

 

+

پارامتر اول، +مقدار جابجايي را مشخص مي‌كند و پارامتر دوم مشخص مي‌كند كه اين مقدار از كجاي +فايل در نظر كرفته شود. سه فلگ (flag + يا پرچم) كه براي اين پارامتر تعريف شده‌اند به شرح +زير هستند:

+

+  

+
+ + + + + + + + + + + + + +
+

ios::cur

+
+

مقدار offset + از مو قعيت + جاري فايل در نظر گرفته مي‌شود

+
+

ios::beg

+
+

مقدار offset از ابتداي فايل در نظر گرفته مي‌شود

+
+

ios::end

+
+

مقدار offset + از انتهاي + فايل در نظر گرفته مي‌شود

+
+
+

+  

+

تابعي كه در +مقابل اين تابع وجود دارد، تابع teelg() + مي‌باشد كه موقعيت جاري اشاره‌گر خواندن فايل +را به صورت يك عدد صحيح برمي‌گرداند.

+

توابع seekp و tellp نيز به همين صورت، براي +كار كردن با موقعيت اشاره‌گر نوشتن در فايل به كار مي‌روند ( حرف g در tellg‌ و seekg + از “get pointer” مي‌آيد و حرف p در tellp و seekp از “put +pointer” مي‌آيد ).

+

 

+

eof() + و fail() + :

+

تابع eof()، در صورتي كه تلاش براي خواندن از انتهاي فايل صورت گيرد، مقدار true + برمي‌گرداند ( eof مخخف End Of File + است ). از اين تابع بايد با دقت استفاده كنيد، چرا كه +اگر آخرين كاركتر فايل به طور معمول خوانده شود و اشاره‌گر فايل در انتهاي فايل +قرار گيرد، اين تابع همچنان مقدار false + برمي‌گرداند ؛ تنها وقتي اين تابع true برمي‌گرداند كه تلاش +براي خواندن از انتهاي فايل صورت گيرد.

+

به مثال زير توجه +كنيد تا موضوع روشن شود:

+

فرض كنيد در +درايو C: فايلي با نام “test.txt” +وجود دارد كه محتويات آن به اين صورت است:

+

 

+
+ + + + +
+

23

+

45

+

 

+
+
+

+  

+

(به يك خط +خالي انتهاي فايل توجه كنيد)

+

 

+

فرض كنيد از +كد زير براي چاپ اعداد فايل استفاده ميكنيم:

+

 

+

#include + <fstream> +

+

#include + <iostream> +

+

 

+

using namespace std;

+

 

+

void main()

+

{

+

    +fstream file;

+

    +file.open ( +"c:\\test.txt", +ios::in );

+

    +if ( !file )

+

    +{

+

          +cout << "Error +in opnenin file." << endl;

+

          +return;

+

    +}

+

 

+

    +int i;

+

    +while ( !file.eof() )

+

    +{

+

          +file >> i;

+

          +cout << i << +endl;

+

    +}

+

    +file.close();

+

}

+

 

+

Output:

+

23

+

45

+

45

+

 

+

همنانطور كه +مي‌بينيد، عدد 45 دو بار چاپ شده است. علت اين است كه بعد از اينكه عدد 45 خوانده +مي‌شود، اشاره‌گر فايل روي كاراكتر انتهايي فايل قرار دارد ولي در واقع يك خط خالي +براي خواند وجود دارد و تابع eof() + همچنان مقدار false + را برمي‌گرداند. وقتي در دور بعدي حلقه، عملگر +استخراج از جريان سعي در خواندن يك عدد ديگر مي‌كند، به انتهاي فايل رسيده و پرچم eofbit در فايل set +مي‌شود و مقدار متغير i + نيز بدون تغيير +باقي مي‌ماند. احضار بعدي تابع + eof() +مقدار true را در پي دارد.

+

براي رفع اين +مشكل، بايد از تابع fail() استفاده كنيد كه مقدار +پرچم failbit را برمي‌گرداند. اين پرچم در +صورتي set مي‌شود كه داده‌ي معتبري از +فايل خوانده نشده باشد. وقتي تابع fail() + مقدار + true برگرداند، به اين معني +است كه عمل خواند قبلي، با موفقيت كامل انجام نشده‌است (البته اين فقط در مورد +عملگر >> +صدق مي‌كند؛ در مورد تابع getline قضيه اندكي فرق مي‌كند).

+

با اصلاح كد بالا +به صورت زير، مشكل رفع مي‌شود:

+

      while +( !file.eof() )

+

      {

+

            +file >> i;

+

            +if ( !file.fail() )

+

                  +cout << i << +endl;

+

      }

+

+  

+

حال اگر فايل “c:\\test.txt” + را به صورت زير تغيير دهيم:

+

 

+
+ + + + +
+

23

+

45

+

Hello

+

192

+
+
+

+  

+

اگر از كد اول +(بدون تابع fail + ) استفاده شود، عدد 45 بدون وقفه چاپ مي‌شود (امتحان +كنيد) و اگر از كد اصلاح شده (با استفاده از fail) +استفاده شود، برنامه بعد از چاپ 23 و 45، بدون چاپ خروجي ديگري، در يك حلقه بي +انتها گير كرده و خاتمه نمي‌يابد. علت اين است كه وقتي كه عملگر >> در دور سوم حلقه سعي در +خواندن عدد صحيح بعدي مي‌كند، چون به يك كاراكتر غيد عددي برخورد مي‌كند، پرچم failbit را set كرده و بدون خواندن +چيزي، برمي‌گردد. چون به انتهاي فايل نيز نرسيده‌ايم، تابع eof +همچنان fasle مي‌باشد. پرچم failbit نيز تا زماني كه +صريحاً پاك نشود، "يك" باقي مي‌ماند. براي پاك كردن پرچم‌هاي خطا بايد از تابع clear() +استفاده شود. راه حل مشكل بالا، اگر هدف فقط حذف كاراكترهاي زائد باشد، به صورت +زير است:

+

 

+

      while +( !file.eof() )

+

      {

+

            +file >> i;

+

            +if ( file.fail() )

+

            +{

+

                  +file.clear();

+

                  +file.ignore ( +1000, '\n' );

+

            +}

+

            +else

+

                  +cout << i << +endl;

+

      }

+

+  

+

+  

+

براي پارامتر اول +تابع ignore + كه تعداد كاراكترهاست، يك مقدار بزرگ قرار داده‌ايم تا +تمام كاراكتر ها را تا ابتداي خط بعدي حذف كند. توجه كنيد كه وقتي پرچم failbit + مقداردهي شده +باشد، هيچ تابع ديگري كار نخواهد كرد. بنابر اين قبل از هر كاري بايد آن‌را پاك +كرد (به همين علت تابع clear قبل از تابع ignore قرار داده شده‌است. اگر جاي اين دو تابع عوض شود، +برنامه باز هم در يك حلقه بينهايت گير مي‌كند).

+

عملگر (!) ، در واقع مقدار تابع fail را برمي‌گرداند. در ضمن عملگر void* +نيز براي streamها طوري تعريف شده است كه مقدار معكوس تابع fail +را برمي‌گرداند (يعني !fail() + ) . اگر متوجه نشديد نگران نباشيد. الآن متوجه +مي‌شويد! هر گاه ما نوعي را در جايي قرار دهيم كه در آنجا معني خاصي نمي‌دهد، +كامپايلر سعي مي‌كند آن را به نوعي تبديل كند كه در آنجا معني بدهد! مثلاً اگر +بنويسيم if ( cin ) ...; ، cin يك شرط نيست كه ما آن را در دستور if + قرار دهيم؛ بنابراين كامپايلر سعي مي‌كند آن را به نوعي تبديك كند كه +بتوان مقدار آن را به صورت + true يا false تفسير كرد. در اين مورد، كامپايلر آن را به نوع void* تبديل مي‌كند و اين تبديل براي streamها مقدار !fail() را برمي‌گرداند. مثلاً به جاي +قطعه كد بالا مي‌توانيد بنويسيد:

+

      while +( !file.eof() )

+

      {

+

            +file >> i;

+

            +if ( file )

+

                  +cout << i << +endl;

+

            +else

+

            +{

+

                  +file.clear();

+

                  +file.ignore ( +1000, '\n' );

+

            +}

+

      }

+

**************

+

+  

+

تعدادي ديگر از +توابع مفيد مربوط به ورودي را در زير مي‌بينيد؛ توجه كنيد كه كلاس ifstream از istream +مشتق شده است، در نتيجه، تمام توابعي كه براي istream +ذكر شد، براي ifstream‌نيز به همان صورت وجود دارد. در ضمن كلاس fstream از ifstream و +ofstream + مشتق مي‌شود و در نتيجه، هر تابعي كه در يكي از اين دو +كلاس وجود داشته باشد، در fstream نيز وجود دارد.

+

 

+

 

+

int + peek();

+

كاراكتر بعدي را +كه قرار است خوانده شود برمي‌گرداند، بدون اينكه آن را از ورودي حذف كند. در واقع +اين تابع مانند تابع get() + (نوع اول) عمل مي‌كند ولي اشاره‌گر فايل را جابجا نمي‌كند. +

+

+  

+

 

+

istream& unget ();

+

آخرين كاركتر +خوانده شده را به ورودي برمي‌گردند. اين تابع موقعي كاربرد دارد كه بخواهيد آخرين +عمل خواندن را لغو كنيد و كاراكتر خوانده شده را سر جايش برگردانيد.

+

+  

+

istream& putback ( + char + ch );

+

كاراكتر ch را به ورودي باز مي‌گرداند! در واقع اين تابع مانند تابع قبلي عمل +مي‌كند ولي نكته اينجاست كه مي‌توانيد هر كاراكتري را كه خواستيد به ورودي +برگردانيد؛ يعني يك كاراكتر را در يك رشته ورودي بنويسيد! مثال زير را ببينيد:

+

+  

+

#include + <iostream> +

+

 

+

using namespace std;

+

 

+

void main()

+

{

+

    +char c[10], c2, c3;

+

 

+

    +c2 = cin.get( );

+

    +c3 = cin.get( );

+

    +cin.putback( +c2 );

+

    +cin.getline( +c, 10 );

+

    +cout << c << +endl;

+

}

+

+  

+

Input:

+

qw

+

 

+

Output:

+

q

+

 

+ + + + + + + + +
+

 

+
+

 

+
+

+
+

 

+

 

+


+

+

istream& read ( + char + *str, + int + count );

+

خواندن قالب بندي +نشده. از اين تابع معمولا براي خواندن از فايل‌هاي باينري استفاده مي‌شود. اين +تابع، دقيقاً مقدار count + بايت از ورودي خوانده (در صورت وجود) و آن را در محلي +كه str + به +آن اشاره مي‌كند ذخيره مي‌كند. در صورتي كه قبل از خواندن cont + بايت به انتهاي فايل برسد، failbit را set مي‌كند.

+

+  

+

****************************

+

 

+

اكنون به +تعدادي از توابع مربوط به خروجي مي‌پردازيم. اين توابع عضوي از كلاس ostream هستند، در نتيجه در ofstream و +fstream نيز به همين شكل وجود دارند.

+

 

+

 

+

open();

+

close();

+

eof();

+

fail();

+

clear();

+

tellp();

+

seekp();

+

اين توابع قبلاً +توضيح داده شده‌اند و در streamهاي خروجي نيز مانند streamهاي ورودي عمل مي‌كنند (البته توابع معادل seekp و tellp، همانطور كه گفته شد، +در جريان‌هاي ورودي seekg و tellg مي‌باشند).

+

+  

+

ofstream& put ( + char + ch );

+

كاركتر ch را (بدون قالب بندي) در خروجي مي‌نويسد. البته مي‌توانيد با +استفاده از عملگر درج در جريان (<<) + نيز +اين كار را انجام دهيد؛ ولي تفاوت اين دو روش در همان قسمت قالب بندي است. بي +خيال. حال ندارم اين يكي را توضيح بدهم!

+

+  

+

 

+

ostream& write ( + char + *str, + int + count );

+

مقدار count + بايت را از آدرس +str + در +خروجي مي‌نويسد. معمولاً براي فايل‌هاي باينري به كار مي‌رود.

+

+  

+

ostream& flush ();

+

محتويات buffer را به خروجي سرازير مي‌كند. ورودي و خروجي جرياني +از سيستم ورودي و خروجي بافر شده استفاده مي‌كنند، به اين معني كه هر چيزي را كه +براي خروجي ارسال مي‌كنيم، مستقيماً به صفحه نمايش يا فايل نمي‌رود، بلكه براي +كارايي بيشتر، ابتدا همه چيز در يك حافظه واسط (همان buffer) +قرار مي‌گيرد و وقتي به مقدار خاصي رسيد، به خروجي واقعي مي‌رود. مثلاً ممكن است +بعد از اينكه سه خط را با cout براي چاپ روي صفحه +نمايش ارسال كرده‌ايد، عملاً چيزي چاپ نشده باشد و بعد از cout +چهارم ناگهان همه چهار خط به صفحه نمايش ارسال شوند. در مورد فايل‌ها اين مسأله +خيلي مهم است و كارايي را خيلي افزايش مي‌دهد. چرا كه هد درايو هاردديسك، در هر +بار عمل خواندن و نوشتن فقط مي‌تواند يك بلوك از اطلاعات (مثلاً 2048 بايت) را +بخواند يا بنويسد و در ضمن خواندن از و يا نوشتن به چند بلوك پشت سر هم بسيار سريع +تر از خواندن يا نوشتن بلوك‌هاي جداگانه است؛ بنابراين، وقتي داده‌ها را براي +نوشتن در فايل ارسال مي‌كنيد، تا زماني كه به اندازه يك يا چند بلوك نشوند به ديسك +ارسال نمي‌شوند.

+

برنامه زير را در +نظر بگيريد:

+

#include + <iostream> +

+

#include + <conio.h> +

+

 

+

using namespace std;

+

 

+

void main()

+

{

+

    +cout << "Hello\n";

+

    +cout << "Press +any key to exit ..." << +endl;

+

    +getch();

+

}

+

 

+

ممكن است قبل از +اجراي دستور getch()، خروجي به صفحه نمايش +نرفته و بدون اينكه كاربر چيزي ببيند دستور getch() + اجرا شود. براي جلوگيري از اين مسأله، بايد cout + را وادار كنيم +كه خروجي را نمايش دهد:

+

+  

+

      cout << +"Hello\n";

+

      cout << +"Press any key to exit ..." << endl;

+

      +cout.flush();

+

      +getch();

+

+  

+

+  

+

حالا مي‌رسيم به containerها .

+

 

+

 

+

Generic Containers

+

 

+

containerها اشيائي هستند كه اشياء ديگر را در خود نگه مي‌دارند. +در C++ + معمولاً +وقتي قرار است تعدادي شيء (از هر نوعي، مثلاً int) +را در يك جا نگه داريم، از آرايه‌ها استفاده مي‌كنيم. مزيت آرايه‌ها در دسترسي +سريع به كليه اعضاي آن است. ولي همانطور كه مي‌دانيم، اشكال آن در اندازه ثابت و +هزينه بالاي درج و حذف عناصر از جايي غير از انتهاي آن است.

+

ساده‌ترين نوع از +containerها +كلاس vector + است كه در واقع مي‌توان آن را يك آرايه با اندازه پويا +در نظر گرفت.

+

نحوه ساختن يك +شيء از كلاس vector به اين صورت است:

+

#include + <vector> +

+

 

+

using namespace std;

+

...

+

...

+

vector<type> + name;

+

 

+

type + نوعي است كه قرار است نگه‌داري شود و name نامي است كه به متغيير vector +خود مي‌دهيد.

+

براي ساختن يك vector + با نام مثلاً numbers + كه مجموعه‌اي از +اعداد صحيح را نگه‌داري كند، به صورت زير عمل مي‌كنيم:

+

vector<int> numbers;

+

هم‌اكنون شما يك +آرايه به اسم number + داريد كه مي‌توانيد هرچه‌قدر كه خواستيد كه در آن عدد +صحيح بريزيد.

+

اينكه عمگرهاي > و < جلوي vector + چكار مي‌كنند و +چطور مي‌توان كلاسي ساخت كه براي هر نوعي كار كند، مربرط به محث templateهاست كه در اينجا +نمي‌خواهم توضيح بدهم؛ براي يادگيري آن مي‌توانيد به كتاب Thinking +In C++ يا هر كتاب آموزش C++ ديگر رجوع كنيد.

+

 

+

برداري كه (يعني +همان vector) به اين صورت ساخته مي‌شود خالي +است و هيج جايي براي عناصر ندارد. شما بايد عناصر را يكي يكي در آن درج كنيد؛ خود vector حافظه مورد نياز را رزرو مي‌كند. براي درج عناصر در +انتهاي vector از تابع push_back +استفاده مي‌شود و براي دسترسي به عناصر آن به سادگي از انديس‌گذاري (indexing) يعني عملگر [] استفاده مي‌شود. تابع size() نيز تعداد عناصر موجود در vecotr +را برمي‌گرداند:

+

 

+

#include + <vector> +

+

#include + <iostream> +

+

 

+

using namespace std;

+

 

+

void main()

+

{

+

    +vector<int> numbers;

+

 

+

    +numbers.push_back ( +1200 );

+

    +numbers.push_back ( +900 );

+

 

+

    +int i;

+

 

+

    +for ( i = 0; i < 13; i++ )

+

          +numbers.push_back ( +i*2 );

+

 

+

    +for ( i = 0; i < numbers.size(); i++ )

+

          +cout << numbers[i] << endl;

+

 

+

}

+

 

+

Output:

+

1200

+

900

+

0

+

2

+

4

+

6

+

8

+

10

+

12

+

14

+

16

+

18

+

20

+

22

+

24

+

+  

+

براي حذف عناصر +از انتهاي vector، از تابع pop_back() +استفاده مي‌شود.

+

براي درج عناصر در +جايي غير از انتهاي بردار، بايد از تابع insert + استفاده كرد:

+

 

+

iterator insert ( iterator where, + const + type &val )

+

 

+

where + مشخص مي‌كند كه عمل درج در كجاي آرايه انجام شود و val مقداري است كه بايد درج شود.

+

 قبل از توضيح دقيقتر اين تابع بايد مفهوم +جديدي به نام iterator (تكرارگر) را توضيح +دهم. پس فعلاً آن را به بعد موكول مي‌كنيم.

+

درج و حذف از +انتهاي vector بسير سريع و كارامد انجام ميشود +(البته در شرايط خاصي، كه اين شرايط بعداً توضيح داده خواهند شد). همچنين دسترسي +به عناصر آن با استفاده از عملگر انديس، مانند دسترسي به عناصر آرايه بسيار سريع +است؛ ولي درج و حذف از جايي غير از انتهاي آن، به زمان خطي (يعني متناسب با اندازه +آرايه) نياز دارد (دقيقاً مثل آرايه)؛ چرا كه بايد همه عناصر بعد از محل حذف يا +درج جابجا شوند. ممكن است در حالتي، زمان دسترسي براي شما خيلي مهم نباشد، بلكه به +اين نياز داشته باشيد كه در هر جايي بين عناصر عمل درج يا حذف را با كارايي بالا +انجام دهيد. در اين صورت بايد ار list استفاده كنيد. عمل درج +و حذف درليست بسيار سريع انجام مي‌شود ولي براي دسترسي به يك عنصر بايد تمام عناصر +را تا عنصر مورد نظر مرور كنيد. list همان چيزي است كه در +ساختمان داده‌ها به آن ليست پيوندي مي‌گوييم.

+

در اينجا توضيح +مختصري راجع به ليست و تكرارگرها مي‌دهيم و سپس به همان vector +برميگرديم تا آن را با دقت بيشتري بررسي كنيم.

+

براي تعريف يك +شيء از كلاس list همانند vector +عمل مي‌كنيم، مثلاً اگر به ليستي از كاراكترها نياز دازيم، چنين مي‌نويسيم:

+

list<char> + mylist;

+

همانند vector، براي درج عناصر در انتهاي ليست از push_back استفاده مي‌كنيم. ليست تابع ديگري نيز براي درج در +ابتداي ليست دارد : push_front. همچنين براي حذف از +ابتدا يا انتهاي ليست، توابع pop_front() و +pop_back() را بكار مي‌بريم. همانطور كه مي‌بينيد، +تا اينجا ليست نسبت به vector برتري داشت؛ ولي هزينه +اين برتري در دسترسي به عناصر داده مي‌شود كه در بخش بعد آن را بررسي مي‌كنيم.

+

 

+

 

+

Iterators

+

+  

+

تكرارگرها +مكانيزمي بسيار هوشمندانه براي دسترسي به عناصر containerها در STL +هستند. اين مكانيزم در تمام containerها به صورت يكسان وجود دارد. اگر شما خودتان يك ليست +پيوندي بسازيد، براي مرور عناصر آن به يك اشاره‌گر نياز داريد تا آدرس گره‌ي مورد +نظر را نگه دراري كند. در STL + تكرارگرها كار همان اشاره‌گر را مي‌كنند با اين تفاوت +كه تكرارگرها بسيار باهوش‌تر از اشاره‌گرها هستند!

+

فرض كنيد ليستي +از اعداد اعشاري داريد كه شامل چند عدد است:

+

      list<float> mylist;

+

 

+

      for ( int i = 1; i <= 10; i++ )

+

            +mylist.push_back ( +1.0/i );

+

 

+

حال مي‌خواهيم اين +اعداد را به ترتيب چاپ كنيم. بايد ابتدا اشاره‌گري (يا همان تكرارگر) به ابتداي +ليست ساخته و بعد از چاپ هر عدد، آنرا در ليست به جلو حركت دهيم تا به عنصر بعدي +اشاره كند. براي تعريف متغير تكرارگر، از كلاس iterator +كه خود عضوي از كلاس list + است استفاده مي‌كنيم (هر containerي تكرارگر مخصوص خود را دارد):

+

 

+

      list<float>::iterator +iter;

+

 

+

حال بايد آن را +مقدار دهي كنيم كه به ابتداي ليست اشاره كند. تابع begin() + ، تكرارگري به ابتداي ليست برمي‌گرداند:

+

      +iter = mylist.begin();

+

 

+

براي دسترسي به محتويات +تكرارگر، از عملگر * + استفاده مي‌كنيم (درست مانند اشاره‌گرها). +توجه كنيد كه تكرارگرها اشاره‌گر نيستند، بلكه عمگر * + براي آن‌ها تعريف مجدد (سربار گذاري يا overloading) شده‌است. پس اگر بخواهيم، داده‌اي را كه تكرارگر +به آن اشاره مي‌كند چاپ كنيم، اين كار را مي‌كنيم:

+

+  

+

cout << *iter << endl;

+

و براي به جلو +بردن تكرارگر، عملگر ++ + سربارگذاري شده‌است:

+

      +iter++;

+

 

+

نهايتاً، نياز به +اين داريم كه بررسي كنيم آيا تكرارگر به انتهاي ليست رسيده‌است يا نه. تابع end() + تكرارگري را برمي‌گرداند كه درست به بعد از عنصر +انتهايي اشاره مي‌كند. بنابراين بايد عمل چاپ و افزايش تكرارگر را تا زماني ادامه +دهيم كه تكرارگر به مقدار + end() + نرسيده باشد. پس حلقه‌اي كه محتويات ليست را چاپ مي‌كند، +به صورت زير خواهد بود:

+

      +list<float>::iterator iter;

+

      for +( iter = +mylist.begin(); +iter != mylist.end(); iter++ )

+

            +cout << *iter +<< endl;

+

+  

+

توجه كنيد كه +تابع end() به آخرين عنصر اشاره نمي‌كند، +بلكه به يك عنصر مجازي بعد از آخرين عنصر اشاره مي‌كند، به همين علت بررسي شرط به +صورت iter!=mylist.end()  است. در ضمن تمام containerها در سرفايل هم نام خودشان قرار دارند؛ بنا +براين براي استفاده از ليست، ابتداي برنامه سر فايل <list> را اضافه كنيد. برنامه +نهايي را همراه با خروجي در زير مي‌بينيد:

+

#include + <list> +

+

#include + <iostream> +

+

 

+

using namespace std;

+

 

+

void main()

+

{

+

    +list<float> mylist;

+

 

+

    +for ( int i = 1; i <= 10; i++ )

+

          +mylist.push_back ( +1.0/i );

+

 

+

    +list<float>::iterator iter;

+

    +for ( iter = mylist.begin(); iter != +mylist.end(); +iter++ )

+

          +cout << *iter +<< endl;

+

 

+

}

+

 

+

Output:

+

1

+

0.5

+

0.333333

+

0.25

+

0.2

+

0.166667

+

0.142857

+

0.125

+

0.111111

+

0.1

+

+  

+

در اينجا مي‌خواهم +به نكته كوچكي اشاره كنم كه هيچ ربطي به STL + ندارد. اگر دقت كنيد، براي درج اعداد در ليست، +از عبارت mylist.push_back(1.0/i) استفاده كرده‌ايم. چرا +به جاي 1 +از 1.0 +استفاده شده‌است؟ نوع يك عبارت محاسباتي بر اساس نوع اجزاي آن تعيين مي‌شود؛ i يك متعير صحيح است و 1 نيز يك عدد صحيح. در نتيجه حاصل 1/i صحيح خواهد بود و در +صورتي كه i از يك بزرگتر باشد، مقدار 1/i + هميشه صفر مي‌شود (امتحان كنيد). به همين علت، بايد +يكي از عملوندهاي عملگر تقسيم اعشاري باشد. در اين صورت، كل عبارت به نوع اعشاري +تبديل خواهد شد.

+

 

+

خوب! اگر بخواهيم +ليست را از انتها به ابتدا چاپ كنيم چه كنيم؟ فكر مي‌كنيد اين راه حل درست باشد:

+

 

+

      for +( iter = +mylist.end(); +iter != mylist.begin(); iter-- )

+

            +cout << *iter +<< endl;

+

 

+

عمگر -- + نيز براي تكرارگرها تعريف شده‌است، پس تا اينجاي قضيه +مشكلي ندارد. اما تابع end() + به يكي بعد از آخرين عنصر اشاره مي‌كند؛ پس در دور اول +حلقه مقدار معتبري چاپ نمي‌شود. در ضمن تابع begin() +به اولين عنصر اشاره مي‌كند كه مقدار معتبري را در خود ذخيره مي‌كند و اين مقدار +چاپ نمي‌شود. پس اين مقدار را جدا چاپ مي‌كنيم:

+

      +iter = mylist.end();

+

      iter--;

+

      for ( ; iter != mylist.begin(); iter-- )

+

            +cout << *iter +<< endl;

+

      +cout << mylist.front() << endl;

+

 

+

مقدار اوليه iter + را اصلاح كرديم +تا به خود آخرين عنصر اشاره كند و عنصر ابتدايي را جداگانه جاپ كرديم. تابع front() + مقدار اولين +عنصر را برمي‌گرداند؛ در واقع مقداري كه اين تابع برمي‌گرداند دقيقاً برابر مقدار *mylist.begin() +است. بسيار خوب! اين كد كار مي‌كند ولي كمي دردسر دارد. راه ساده‌تري نيز وجود +دارد : تكرارگر معكوس.

+

+  

+

      list<float>::reverse_iterator +iter;

+

 

+

      for ( iter =  mylist.rbegin(); iter != +mylist.rend(); +iter++ )

+

            +cout << *iter +<< endl;

+

+  

+

+  

+

نوع reverse_iterator + دقيقاً +مانند نوع iterator + است با اين تفاوت كه عملگرهاي ++ و -- بر عكس روي آن عمل مي‌كنند. +تابع rbegin() يك تكرارگر معكوس به ابتداي +معكوس ليست (يعني انتهاي آن!) برمي‌گرداند و تابع rend() + يك تكرارگر معكوس به عنصر فرضي بعد از عنصر +انتهاي معكوس ليست (باز هم يعني ابتداي ليست) برمي‌گرداند.

+

حالا به تابع insert مي‌پردازيم تا آن را دقيقر توضيح دهيم. قالب اين +تابع به اين صورت است:

+

 

+

iterator insert ( iterator where, + const + type& val );

+

iterator insert ( iterator where, size_t count, + const + type& val );

+

+  

+

نوع اول اين +تابع، مقدار val + را در محل where +درج مي‌كند و نوع دوم نيز همين كار را count +بار انجام مي‌دهد. براي درج در هر جاي ليست، ابتدا بايد تكرارگري داشته باشيم كه +به محل مورد نظر اشاره كند. قبلا ديديم كه دو تابع push_front + و push_ back +عمل درج را در ابتدا و انتهاي ليست انجام مي‌دهند؛ مي‌توان با تابع insert نيز كار اين دو تابع را انجام داد:

+

mylist.insert ( mylist.begin(), 23.54 ); <---> mylist.push_front ( 23.54 );

+

mylist.insert ( mylist.end(), 1044.3 );  +<---> mylist.push_back ( 1044.3 );

+

عمل درج در محل where + طوري انجام مي‌شود +كه عنصر درج شده در محل عنصري كه where به آن اشاره مي‌كند +قرار گيرد و عنصر قبلي به جلو رانده مي‌شود. يعني در واقع عنصر جديد قبل از عنصر +قبلي درج مي‌شود. به همين علت در خط اول، درج در محل begin() +يعني درج قبل از عنصر اول ليست به طوري كه عنصر جديد عنصر ابتدايي باشد. و در خط +دوم، درج در محل end() + يعني قبل از عنصر فرضي بعد از آخرين عنصر يا بعد از +آخرين عنصر.

+

فرض كنيد ليستي +داريد كه به اين صورت ساخته‌ايد:

+

      list<int> test;

+

      test.push_front +( 10 );

+

      +test.push_front ( +20 );

+

      +test.push_front ( +30 );

+

      +test.push_front ( +40 );

+

      +test.push_front ( +50 );

+

      +test.insert ( +test.end(), +10, 900 );

+

اكنون محتويات +ليست به اين صورت است :

+

50        +40  30  20  10  900  900  900  900  900  + 900  900  900  900  900

+

(در خط آخر 10 بار +عدد 900 را در انتهاي ليست درج كرديم)

+

حال مي‌خواهيم در +موقعيت هفتم لسيت (بعد از اولين 900) عدد 5 را درج كنيم؛ چاره‌اي نداريم جز مرور +ليست تا محل مورد نظر:

+

      list<int>::iterator +iter;

+

      iter = +test.begin();

+

      for ( int i = 0; i < 6; i++ )

+

            +iter++;

+

      +test.insert ( +iter, 5 );

+

+  

+

و اين هم آخرين +مطلب در مورد تكرارگرها:

+

فرض كنيد مي‌خواهيد +ليستي از نقاط روي صفحه را نگه‌داري كنيد. مختصات يك نقطه شامل دو مؤلفه x و y است؛ بنابراين ابتدا يك +ساختار (struct) تعريف مي‌كنيم كه شامل دو فيلد +x و y + باشد:

+

struct Point

+

{

+

    +int x, y;

+

};

+

و سپس يك vector از اين ساختار مي‌سازيم:

+

    +vector<Point> +points;

+

و بعد هم چند +عنصر در آن درج مي‌كنيم:

+

      +Point p;

+

 

+

      p.x = 0;

+

      p.y = 0;

+

      +points.push_back ( +p );

+

 

+

      p.x = 10;

+

      p.y = 15;

+

      +points.push_back ( +p );

+

 

+

      p.x = 15;

+

      p.y = 25;

+

      +points.push_back ( +p );

+

 

+

حالا مي‌خواهيم +عنصر دوم را چاپ كنيم. ابتدا تكرارگري ساخته و آن را به عنصر دوم نسبت مي‌دهيم:

+

+  

+

      vector<Point>::iterator iter;

+

      iter = +++points.begin();

+

+  

+

اكنون iter به يك Point + اشاره مي‌كند كه خود شامل دو مؤلفه x و y است. يعني *iter يك struct + است. پس براي +چاپ محتويات آن مي‌توانيم به اين صورت عمل كنيم:

+

      cout << +(*iter).x << "\t" +<< (*iter).y << endl;

+

(مي‌دانيد كه ‘\t’ كاراكتر tab يا جدول بندي است)

+

اما عملگر (->) + نيز براي تكرارگرها درست مانند اشاره‌گرها تعريف شده‌است. +پس مي‌توانيد به اين صورت نيز عمل كنيد:

+

      cout << +iter->x << +"\t" << +iter->y << +endl;

+

و Visual Studio + نيز به اندازه +كافي باهوش است كه بعد از تايپ كاراكتر > محتويات Point +را به ما نشان دهد.

+

+  

+

حال چند container را با جزئيات بيشتر بررسي مي‌كنيم.

+

 

+

 

+

vector

+

 

+

همانطور كه +گفتيم، vector مانند يك آرايه پويا عمل مي‌كند؛ +خصوصيات آن نيز بسيار شبيه به آرايه است: درج در انتهاي آن بسيار سريع انجام مي‌شود +(در صورتي كه به تخصيص حافظه نياز نباشد)، درج در ميانه آن با جابجايي بقيه عناصر +همراه است، و براي دسترسي به هر جاي آن، فقط به يك انديس نياز داريم.

+

قطعه كد زير را +در نظر بگيريد:

+

      vector<long> v;

+

      v.push_back +( 4443 );

+

      v.push_back ( 24 );

+

      v.push_back ( 1001 );

+

اعمالي كه كلاس vector انجام مي‌دهد به اين صورت است:

+

در خط اول، +سازنده vector، يك vector +تهي كه جايي براي هيچ عنصري ندارد مي‌سازد.

+

در خط دوم، حافظه +كافي براي يك عدد long (مثلاً 4 بايت) رزرو +شده و عدد 4443 در آن كپي مي‌شود. نام اين حافظه را m1 +مي‌گذاريم.

+

در خط سوم، حافظه +ديگري به اندازه دو عدد long (مثلاً 8 بايت) رزرو +شده (اسم آن را m2 مي‌گذاريم)، مقدار قبلي +خانه اول vector يعني 4443 در 4 بايت اول آن كپي +شده و m1 آزاد مي‌شود، سپس عدد 24 در 4 +بايت انتهايي m2 + كپي مي‌شود.

+

در خط چهارم، +حافظه ديگري براي سه عنصر (12 بايت) رزرو شده (m3) +و مقدار قبلي m2 يعني دو عدد 4443 و 24 در +ابتداي آن كپي مي‌شوند. سپي m2 آزاد شده و عدد 1001 +نيز در 4 بايت آخر m3 كپي مي‌شود.

+

در يك vector همه عناصر بايد پشت سر هم در يك حافظه خطي قرار +داشته باشند. بنابراين براي درج يك عنصر جديد در انتهاي vector ، +لازم است كه حافظه جديدي رزرو شود كه همه عناصر قبلي بعلاوه عنصر جديد را در خود +جاي دهد. مثلاً اگر vectorي داشته باشيد كه حاوي 10000 عنصر باشد، هنگام درج يك +عنصر جديد، لازم است كه يك فضاي جديد براي 10001 عنصر رزرو شده و همه 10000 عنصر +قبلي بعلاوه عنصر جديد در آن كپي شوند. اين عمليات بسيار كند و غير بهينه است؛ راه +حل چيست؟ كلاس vector تابعي به نام reserve دارد كه مقداري حافظه از پيش رزرو مي‌كند تا عمليات +درج بهينه‌تر انجام شود. قطعه كد زير را در نظر بگيريد:

+

      vector<long> v;

+

      v.reserve +( 10 );

+

      v.push_back ( 4443 );

+

      v.push_back ( 24 );

+

      v.push_back ( 1001 );

+

در خط دوم، به +اندازه 10 عنصر حافظه رزرو مي‌شود؛ بنابراين، اعمال درج بعدي، هيچ هزينه‌اي در بر +نداشته و بسيار سريع انجام مي‌شوند. تا درج دهمين عنصر مشكلي پيش نمي‌آيد، هنگام درج +يازدهمين عنصر، حافظه جديدي به طول 11 رزرو شده و همه 10 عنصر قبلي در آن كپي مي‌شوند. +تابع capacity()، مقدار حافظه رزرو شده توسط vector را برمي‌گرداند. به طور معمول، اين مقدار برابر +تعداد عناصر موجود در ليست است (همان چيزي كه تابع size() +برمي‌گرداند). ولي اگر از تابع reserve براي رزرو قبلي حافظه +استفاده شود، اين مقدار مي‌تواند بيشتر از مقدار size() +باشد. و قتي بعد از درج عناصر بعدي، مقدار size() +به مقدار capacity() برسد، نياز به تخصيص +مجدد حافظه و جابجايي همه محتويات ليست است.

+

براي استفاده +بهينه از vector شما بايد حدود تعداد عناصر مورد +نياز را بدانيد و با استفاده از تابع reserve() +حافظه مورد نياز را قبل از درج عناصر در vector +رزرو كنيد؛ در غير اين صورت، تعداد زياد رزرو حافظه جديد و كپي عناصر از محلي به +محل ديگر، كارايي برنامه را به شدت كاهش خواهد داد. كلاس deque +(كه بعداً آن را بررسي مي‌كنيم) در ضمن داشتن مزاياي vector، +اين عيب را ندارد.

+

 

+

يك نكته ديگر در +مورد vector وجود دارد و آن هم تفاوت بين +تكرارگرها در vector و list است. در list + تكرارگرها فقط مي‌توانند بوسيله عملگرهاي ++ و -- + يك عنصر به جلو يا عقب حركت كنند. علت اين موضوع به +ساختار ليست مربوط مي‌شود. در vector، به علت ساختار آرايه‌اي +آن، تكرارگرها مي‌توانند بوسيله عملگرهاي + و در يك مرحله به مقدار دلخواه به +جلو يا عقب حركت كنند. مثلاً براي درج عدد 15 در محل هفتم vector +(انديس 6)، مي‌توانيم از كد زير استفاده كنيم:

+

      v.insert +( v.begin() + 6, 15 );

+

در ضمن مي‌توانيم +از انديس گذاري نيز بر روي تكرارگرهاي vector +استفاده كنيم. مثلا اگر تكرارگري داريم كه به محلي در vector + اشاره مي‌كند، براي مقدار دهي عنصر دوم بعد از +آن مي‌توانيم بنويسيم:

+

      +iter[2] = 15;

+

به اين جور +تكرارگرها كه امكان دسترسي به هر جاي container +را دارند، تكرارگرهاي با دسترسي تصادفي (random-access) +مي‌گويند و به تكرارگرهايي كه فقط قابليت افزايش يا كاهش به اندازه يك واحد را +دارند (مانند list) تكرارگرهاي دو جهته (bidirectional) مي‌گويند.

+

نكته ديگري كه در +مورد تكرارگرها در vecotr بايد گفت اين است كه +هنگام درج يك عنصر در vector يا حذف يك عنصر از آن، +كليه تكرارگرهايي كه بعد از عنصر درج يا حذف شده اشاره مي‌كنند، نا معتبر شده و +بايد مجدداً مقدار دهي شوند؛ البته اين در صورتي است كه تخصيص مجدد حافظه براي كل vector صورت نگيرد. در غير اين صورت، كليه تكرارگرهاي +مربوط به آن شيء نامعتبر مي‌شوند.

+

 

+

در زير توابع +موجود در كلاس vector را بررسي مي‌كنيم. +اكيداً توصيه مي‌كنم كه سعي در حفظ كردن اين توابع نكنيد. بلكه از MSDN + يا اين مقاله به عنوان مرجع هنگام برنامه نويسي +استفاده كنيد. در پايان اين مقاله به چند نكته اشاره خواهم كرد كه در پيدا كردن +مطلب مورد نظر در + MSDN به شما كمك مي‌كند.

+
+ + + + + + + + +
+

+  

+
+

 

+
+

+
+
+

+  

+

 

+


+

+

vector();

+

vector + ( size_t count );

+

vector + ( size_t count, const type& val + );

+

vector + ( + const + vector& right + );

+

سازنده كلاس vector؛ براي ساختن يك vector + جديد مي‌توانيد از هر كدام از اين سازنده‌ها براي مقدار دهي اوليه آن +استفاده كنيد. نوع اول يك + vector +تهي مي‌سازد. تا اينجا ما تنها از اين نوع استفاده كرده‌ايم. متذكر مي‌شوم كه +هنگام ساختن يك شيء از هر كلاسي، حتماً سازنده آن صدا مي‌شود؛ مثلاً در اين كد:

+

      +vector<long> v;

+

سازنده پيش فرض +كلاس vector كه همان سازنده بدون پارامتر +(نوع اول كه در بالا مي‌بيبيد) است صدا مي‌شود.

+

نوع دوم، يك vector با اندازه اوليه count +مي‌سازد. اين عناصر با مقدار پيش فرض خود مقداردهي مي‌شوند (مثلاً 0 + براي اعداد و false +براي bool). نوع size_t + در سيستم‌هاي 32 بيتي (همان چيزي كه همه ما +اكنون در حال استفاده از آن هستيم) برابر يك عدد بدون علامت 32 بيتي ( unsigned int) است و در سيستم‌هاي 64 بيتي، يك عدد بدون علامت 64 +بيتي.

+

نوع سوم، تعداد count عنصر با مقدار اوليه val +در vector ساخته شده درج مي‌كند.

+

نوع چهارم، يك +كپي از يك vector ديگر ايجاد مي‌كند. به مثال زير +توجه كنيد:

+

      vector<char> v1 ();

+

      vector<char> v2 ( 9 );

+

      +v2[3] = 'a';

+

      +vector<char> v3 ( 5, '+' );

+

      +vector<char> v4 ( v2 );

+

      +v4[0] = 'b';

+

v1 يك vector + تهي است (جفت پرانتز جلوي + v1 + اختياري هستند؛ +در هر صورت سازنده پيش فرض صدا مي‌شود). v2 + با 9 عنصر با مقدار ‘\0’ + ساخته شده و سپي عنصر انديس 3 (چهارمين عنصر) با +كاراكتر ‘a’ +مقدار دهي مي‌شود. v3 شامل 5 كاراكتر ‘+’ است. v4 با كپي گرفتن از v2 ساخته شده و سپي عنصر اول +آن با كاراكتر ‘b’ + مقدار دهي مي‌شود.

+ + + + + + + + +
+

 

+
+

 

+
+

+
+

 

+


+

+

void + push_back + ( + type& + val + );

+

همانطور كه توضيح +داده شد، val + را در انتهاي بردار درج مي‌كند.

+
+ + + + + + + + +
+

 

+
+

 

+
+

+
+
+

+  

+


+

+

void + pop_back + ();

+

عنصر انتهايي +بردار را حذف مي‌كند. معمولاً اين دستور مقدار ظرفيت (capacity) +بردار را تغيير نمي‌دهد؛ مثلاً اگر vector + شما حاوي 3 عنصر باشد، بعد از اجراي تابع + pop_back()، +مقدار size() برابر 2 خواهد شد ولي مقدار capacity() همچنان 3 باقي خواهد ماند.

+
+ + + + + + + + +
+

 

+
+

 

+
+

+
+
+

+  

+


+

+

size_t + size();

+

تعداد عناصر +موجود در ليست را برمي‌گرداند.

+
+ + + + + + + + +
+

 

+
+

 

+
+

+
+
+

+  

+


+

+

bool + empty();

+

در صورتي كه vector تهي باشد، مقدار true + برمي‌گرداند و در غير اين صورت مقدار false + برمي‌گرداند. به +جاي اين تابع مي‌توان از عبارت size()==0 +استفاده كرد.

+
+ + + + + + + + +
+

 

+
+

 

+
+

+
+
+

+  

+


+

+

void + clear();

+

كليه محتويات vector را پاك مي‌كند. بعد از اجراي اين تابع، مقدار size() صفر خواهد بود.

+
+ + + + + + + + +
+

 

+
+

 

+
+

+
+
+

+  

+


+

+

type& + front();

+

يك مرجع (reference) به عنصر ابتداي vector + برمي‌گرداند. اين با برگرداندن مقدار ( value) فرق مي‌كند، چرا كه مي‌توان اين تابع را در طرف راست عمگر تساوي +قرار داد و مقدار عنصر را تغيير داد:

+

      v.front() = 6;

+
+ + + + + + + + +
+

+  

+
+

 

+
+

+
+
+

 

+


+

+

type& + back();

+

يك مرجع به آخرين +عنصر vector برمي‌گرداند.

+
+ + + + + + + + +
+

 

+
+

 

+
+

+
+
+

 

+


+

+

size_t capacity();

+

تعداد عناصري را +برمي‌گرداند كه شيء vector مي‌تواند بدون تخصيص دهي +حافظه جديد در خود نگه داري كند.

+
+ + + + + + + + +
+

 

+
+

 

+
+

+
+
+

 

+


+

+

void + reserve + ( size_tcount + );

+

براي نگه‌داري +حداقل count عنصر در شيء vector حافظه رزرو مي‌كند.

+
+ + + + + + + + +
+

 

+
+

 

+
+

+
+
+

 

+


+

+

iterator insert + ( + iterator where, + const + type& val + );

+

void + insert + ( + iterator where, + size_t count, + const + type& val + );

+

يك يا چند عنصر +با مقدار val در محل where + درج مي‌كند. براي توضيح بيشتر، به قسمت +تكرارگرها مراجعه كنيد.

+
+ + + + + + + + +
+

 

+
+

 

+
+

+
+
+

+  

+


+

+

iterator erase + ( + iterator where + );

+

iterator erase + ( + iterator first, + iterator last + );

+

عنصري يا عناصري +را از vector + حذف مي‌كنند. در نوع اول، where +عنصري را نشان مي‌دهد كه بايد حذف شود. در نوع دوم، first +اولين عنصري كه بايد حذف شود را نشان مي‌دهد و last +عنصر بعد از آخرين عنصري كه بايد حذف شود را مشخص مي‌كند. توجه كنيد كه خود last حذف نمي‌شود. اين دو تابع تكرارگري به اولين عنصر بعد از عناصر +حذف شده برمي‌گردانند.

+
+ + + + + + + + +
+

 

+
+

 

+
+

+
+
+

+  

+


+

+

iterator begin + ();

+

تكرارگري به +اولين عنصر vector برمي‌گرداند.

+
+ + + + + + + + +
+

 

+
+

 

+
+

+
+
+

+  

+


+

+

iterator end + ();

+

تكراگري برمي‌گرداند +كه درست به بعد از آخرين عنصر vector اشاره مي‌كند. اگر vector تهي باشد، اين مقدار با مقدار begin() برابر است.

+

+  

+

iterator rbegin + ();

+

يك تكرارگر +معكوس (reverse_iterator) به اولين عنصر در +بردار معكوس شده برمي‌گرداند.

+
+ + + + + + + + +
+

 

+
+

 

+
+

+
+
+

+  

+


+

+

iterator rend + ();

+

يك تكرارگر معكوس +برمي‌گرداند كه درست به بعد از آخرين عنصر در بردار معكوس شده اشاره مي‌كند.

+

+  

+
+ + + + + + + + +
+

+  

+
+

 

+
+

+
+
+

 

+


+

+

void + resize + ( + size_t newsize + );

+

void + resize + ( + size_t newsize, type val + );

+

اندازه vector را تغيير مي‌دهد. اگر مقدار newsize +از اندازه فعلي vector كمتر باشد، عناصر از +انتهاي vector حذف مي‌شوند تا اندازه آن به newsize برسد. اگر newsize +بيشتر از اندازه فعلي vector + باشد، عناصر جديد به انتهاي آن اضافه مي‌شوند. در صورت +مشخص كردن مقدار val، اين عناصر با val مقداردهي  مي‌شوند؛ در غير اين صورت با مقدار پيش فرض مقدار +دهي مي‌شوند.

+
+ + + + + + + + +
+

 

+
+

 

+
+

+
+
+

+  

+


+

+

void + assign + ( + size_t count, + const + type& val + );

+

كليه عناصر vector را حذف كرده و count +عنصر با مقدار val در آن درج مي‌كند.

+
+ + + + + + + + +
+

 

+
+

 

+
+

+
+
+

+  

+


+

+

type& + operator[] ( + size_t pos + );

+

همانطور كه گفته شد، +يك مرجع (reference) به عنصر با انديس pos برمي‌گرداند.

+
+ + + + + + + + +
+

 

+
+

 

+
+

+
+
+

+  

+


+

+

vector& + operator= ( + vector& + right + );

+

عملگر تخصيص دهي +(assignment) براي كليه containerها به نحوي +تعريف شده است كه يك كپي از container + سمت راست در container +سمت چپ عملگر تساوي مي‌سازد:

+

      +vector<int> v1(10,100);

+

      vector<int> v2 (5,990);

+

      +v2 = v1;

+

بعد از عمل تخصيص +دهي (assignmentv2 +نيز حاوي 10 عنصر با مقدار 100 خواهد بود.

+

+  

+

مطالب مربوط به vector + به پايان رسيد. +اكنون به بررسي كلاس list مي‌پردازيم.

+

 

+

 

+

list

+

 

+

كلاس list برخلاف vector اجازه دسترسي تصادفي به +همه عناصر را نمي‌دهد ولي در عوض هر گونه عمل درج و حذف در آن با كارايي بالا +انجام مي‌شود و در تمام اعمال درج و حذف، فقط تكرارگر مربوط به عنصر تحت تأثير نا +معتبر مي‌شود. تكرارگرهاي كلاس list + فقط مي‌توانند با عملگرهاي ++ و -- به اندازه يك عنصر به جلو يا +عقب حركت كنند و امكان انديس گذاري نيز بر روي آن‌ها وجود ندارد.

+

اكثر توابع مربوط +به list دقيقاً مانند vector هستند و فقط در نحوه انجام كار با آن تفاوت دارند. +در زير مروري بر اين توابع مي‌كنيم:

+

 

+

 

+

list();

+

list +( size_t count );

+

list +( size_t count, const type& val + );

+

list +( + const + list& right + );

+

سازنده كلاس list. اين سازنده‌ها دقيقا مانند سازنده‌هاي vector +عمل مي‌كنند.

+
+ + + + + + + + +
+

 

+
+

 

+
+

+
+
+

 

+


+

+

size_t + size();

+

bool + empty();

+

void + clear();

+

type& + front();

+

type& + back();

+

void + push_back + ( + type& + val + );

+

void + pop_back + ();

+

iterator insert + ( + iterator where, + const + type& val + );

+

void + insert + ( + iterator where, + size_t count, + const + type& val + );

+

iterator erase + ( + iterator where + );

+

iterator erase + ( + iterator first, + iterator last + );

+

iterator begin + ();

+

iterator end + ();

+

iterator rbegin + ();

+

iterator rend + ();

+

void + resize + ( + size_t newsize + );

+

void + resize + ( + size_t newsize, type val + );

+

void + assign + ( + size_t count, + const + type& val + );

+

list& + operator= ( + list& + right + );

+

 

+

اين توابع نيز +دقيقاً همان كاري را انجام مي‌دهند كه در كلاس vector +انجام مي‌دادند. در واقع در اين ليست فقط توابع capacity() و +reserve() موجود نيستند چرا كه list نيازي به تخصيص حافظه از قبل ندارد.

+
+ + + + + + + + +
+

 

+
+

 

+
+

+
+
+

+  

+


+

+

void + push_front + ( + type& + val + );

+

void + pop_front + ();

+

اين دو تابع كه +در vector وجود نداشتند، عمل درج و حذف را +از ابتداي ليست انجام مي‌دهند.

+
+ + + + + + + + +
+

 

+
+

 

+
+

+
+
+

+  

+


+

+

void + remove + ( + const + type& + val + );

+

كليه عناصر موجود +در ليست كه با val + برابر باشند را حذف مي‌كند.

+
+ + + + + + + + +
+

 

+
+

 

+
+

+
+
+

+  

+


+

+

void + reverse + ();

+

ترتيب عناصر را در +ليست معكوس مي‌كند. در اين عمليات، تنها اشاره‌گرها تغيير مي‌كنند، بنا براين اين +عمليات سريع و بهينه انجام مي‌شود (آن را با تابع reserve +اشتباه نگيريد).

+
+ + + + + + + + +
+

 

+
+

 

+
+

+
+
+

+  

+


+

+

void + sort + ();

+

عناصر ليست را به +صورت صعودي مرتب مي‌كند.

+

+  

+

 

+

اكنون به يك cantainer ديگر مي‌پرازيم كه با داشتن مزاياي vector، معايت آن را ندارد.

+

 

+

 

+

deque

+

 

+

 

+

كلاس deque (بخوانيد deck) مانند vector امكان دسترسي تصادفي به همه اعضا را با استفاده از انديس‌گذاري +مي‌دهد. در ضمن امكان درج در دو سر deque + وجود دارد و در صورت درج عناصر جديد در دو سر +آن نيازي به تخصيص دهي مجدد حافظه براي كل اعضا نيست. در deque، +تمام اعضاء در يك بلوك حافظه به صورت پشت سر هم (مانند vector) ذخيره +نمي‌شوند. بلكه داده‌ها در بلوك‌هايي با طول ثابت (مثلاً 10 عنصر) نگه‌داري مي‌شوند +و در صورت نياز به تخصيص حافظه، يك بلوك از حافظه به طور يكجا رزرو مي‌شود. اين +باعث مي‌شود كه عمليات دسترسي به اعضا با استفاده از انديس، كمي كندتر از vector انجام شود ولي در عوض، در صورت درج عناصر در دو +انتهاي deque، هرگز نيازي به تخصيص دهي مجدد +حافظه و كپي اعضا در محل ديگري از حافظه نيست. البته اين موضوع در مورد درج عناصر +در ميان deque صدق نمي‌كند.

+

توابع عضو كلاس deque دقيقاً مانند vector هستند، با اين تفاوت كه +دو تابع reserve() و capacity() در deque +وجود ندارد و دو تابع push_front() و pop_front در آن وجود دارد.

+

در اكثر موارد +كلاس deque، بهترين انتخاب براي مصارف +عمومي است.

+

 

+

 

+

Container Adaptors

+

 

+

كلاس‌هايي كه تا +اينجا بررسي كرديم، containerهايي عمومي بودند كه در آنها اعضا به ترتيب، پشت سرهم +قرار مي‌گرفتند و همه اعضا نيز هميشه قابل دسترس بودند. به اين containerها Suquence Container مي‌گويند (vector، list و deque در اين دسته قرار مي‌گيرند). containerهاي ديگري نيز وجود دارند كه تنها براي مصارف +خاص به كار مي‌روند مانند stak، queue و +priority_queue. اين سه كلاس، همان چيزهايي +هستند كه در ساختمان داده‌ها خوانده‌ايد.

+

stack در واقع يك deque است كه فقط امكان درج و حذف از انتهاي آن وجود دارد و فقط دسترسي +به عنصر بالاي آن امكان پذير است. اين‌ها همان اعمالي هستند كه از يك پشته انتظار +مي‌روند. توابع عضو كلاس stack به طور خلاصه به شرح +زير است:

+

void + push + ( + const + type& + val + );

+

مقداري را در +انتهاي پشته درج مي‌كند.

+

void + pop + ();

+

عنصر بالاي پشته +را حذف مي‌كند.

+

type& + top + ();

+

مقدار عنصر بالاي +پشته را برمي‌گرداند.

+

size_t size + ();

+

تعداد عناصر موجود +در پشته را برمي‌گرداند.

+

bool + empty + ();

+

در صورت خالي +بودن پشته true و در غير اين صورت false برمي‌گرداند.

+

+  

+

 

+

كلاس queue (صف) فقط اعمال مربوط به ساختمان داده صف را پشتيباني مي‌كند يعني +اينكه امكان درج، تنها در انتهاي آن وجود دارد و امكان حذف تنها از ابتداي آن (First In Fist Out) :

+

void + push + ( + type& + val + );

+

مقدار val را در انتهاي صف درج مي‌كند.

+

void + pop + ();

+

يك عنصر را از +ابتداي صف حذف مي‌كند.

+

type& + front + ();

+

مرجعي به عنصر +ابتداي صف برمي‌گرداند.

+

type& + back + ();

+

مرجعي به عنصر +انتهاي صف (آخرين عنصر درج شده) برمي‌گرداند.

+

size_t size + ();

+

تعداد عناصر +موجود در صف را برمي‌گرداند.

+

bool + empty + ();

+

در صورت خالي +بودن صف true و در غير اين صورت false برمي‌گرداند.

+

+  

+

 

+

priority_queue + اعمال مربوط به ساختمان داده صف اولويت را پشتيباني مي‌كند؛ +يعني تنها امكان دسترسي به بزرگ‌ترين عنصر آن وجود دارد:

+

void + push + ( + type& + val + );

+

مقدار val + را در صف درج مي‌كند +(جاي عنصر را شما تعين نمي‌كنيد).

+

void + pop + ();

+

بزرگ‌ترين +عنصر صف را حذف مي‌كند.

+

const type& + top + ();

+

مقدار بزرگ‌ترين عنصر صف را برمي‌گرداند.

+

size_t size + ();

+

تعداد عناصر +موجود در صف را برمي‌گرداند.

+

bool + empty + ();

+

در صورت خالي +بودن صف true + و در غير اين صورت false +برمي‌گرداند.

+

+  

+

 

+

 

+

Strings

+

 

+

كار كردن با رشته‌ها +يكي از اعمال پر دردسر C++ است؛ شما مجبوريد از قبل +بدانيد كه طول رشته شما چقدر است و بايد هميشه مواظب باشيد به خارج از محدوده +حافظه رشته‌تان دسترسي پيدا نكنيد. STL شامل كلاسي با نام string است كه تمام اين مشكلات (و خيلي از مشكلات ديگر) را +برطرف مي‌كند. به مثال زير توجه كنيد تا مسأله برايتان روشن شود:

+

#include + <iostream> +

+

#include <string>  +// do not forget to include the header file

+

 

+

using std::cout;

+

using std::cin;

+

using std::endl;

+

using std::string;

+

 

+

 

+

void main()

+

{

+

    +string name;

+

    +cout << "What's +your name? ";

+

    +cin >> name;

+

    +string hello = "Hello +" + name;

+

    +hello += " +...";

+

    +string greeting;

+

    +greeting = "How +are you today ?";

+

    +greeting.insert ( +18, name );

+

    +cout << hello << +endl << greeting << endl;

+

    +greeting[0] = 'A';

+

    +greeting[1] = 'B';

+

    +greeting[2] = 'C';

+

    +cout << greeting << endl;

+

}

+

 

+

Output:

+

What's your name? + Muhammad

+

Hello Muhammad ...

+

How are you today Muhammad?

+

ABC are you today Muhammad?

+

+  

+

مي‌بينيد كه به +چه راحتي هر كاري مي‌توان با stringها انجام داد. در ضمن عملگرهاي == و != + و < و > + نيز براي مقايسه +دو رشته با يكديگر تعريف شده‌اند .

+

حالا به بعضي +توابع مربوط به كلاس string مي‌پردازيم.

+

 

+

1:  string + ();

+

2:  string + ( + char* str + );

+

3:  string + ( + char* str, + int + count + );

+

4:  string + ( + string& + right + );

+

5:  string + ( string& right, + int + off + );

+

6:  string + ( string& right, + int + off, + int + count + );

+

7:  string + ( intcount, charch );

+

+  

+

سازنده‌هاي كلاس string كه شما مي‌توانيد براي ساختن يك رشته جديد از آنها +استفاده كنيد. البته مجبور نيستيد؛ مي‌توانيد يك رشته تهي بسازيد و سپس آن را با +عملگر = +مقدار دهي كنيد.

+

چون تعداد سازنده‌ها +زياد بود آن‌ها را شماره‌گذاري كردم. نوع اول يك رشته تهي مي‌سازد ("") ( همانطور كه گفتم جفت پرانتز +جلوي آن اختياري هستند). نوع دوم يك كپي از رشته معمولي C + مي‌سازد. نوع سوم مانند نوع دوم است ولي به +تعداد count كاراكتر از str را در رشته جديد كپي مي‌كند. نوع چهارم يك كپي از يك string ديگر ايجاد مي‌كند. نوع پنجم عمل كپي را از محل off از رشته right آغاز مي‌كند. نوع ششم +از اندي off در رشته right، +به تعداد count كاراكتر در رشته جديد كپي مي‌كند. +و نوع هفتم count بار كاراكتر ch را در رشته تكرار مي‌كند. به مثال زير دقت كنيد:

+

#include + <iostream> +

+

#include + <string> +

+

 

+

using namespace std;

+

 

+

void main()

+

{

+

    +// construct an empty string

+

    +string s1;

+

 

+

    +string s2 ( "Copy +form a C string" );

+

    +

+

    +char cstr[] = "A Sample C +String";

+

    +string s3 ( cstr, +10 );

+

 

+

    +string s4 ( s2 );

+

    +string s5 ( s2, +14 );

+

    +string s6 ( s2, +5, 4 );

+

    +string s7 ( 6, '*' );

+

 

+

    +cout << "s1 +: " << s1 << endl;

+

    +cout << "s2 +: " << s2 << endl;

+

    +cout << "s3 +: " << s3 << endl;

+

    +cout << "s4 +: " << s4 << endl;

+

    +cout << "s5 +: " << s5 << endl;

+

    +cout << "s6 +: " << s6 << endl;

+

    +cout << "s7 +: " << s7 << endl;

+

 

+

}

+

 

+

Output:

+

s1 :

+

s2 : Copy form a C string

+

s3 : A Sample C

+

s4 : Copy form a C string

+

s5 : string

+

s6 : form

+

s7 : ******

+
+ + + + + + + + +
+

 

+
+

 

+
+

+
+
+

 

+

 

+


+

+

int length();

+

طول رشته را برمي‌گرداند.

+
+ + + + + + + + +
+

 

+
+

 

+
+

+
+
+

 

+


+

+

int + find + ( + char + ch, + int + off + = + 0 + );

+

int + find + ( + char + *str, + int + off + = + 0 + );

+

int + find + ( +string str, + int + off + = + 0 + );

+

كاركتر ch + و يا رشته str را در رشته جستجو كرده و در صورت موفقيت انديس اولين وقوع آن را +برمي‌گرداند. در غير اين‌صورت مقدار -1 + را برمي‌گرداند. عمل جستجو از انديس + off شروع مي‌شود كه مقدار پيش فرض آن صفر است.

+
+ + + + + + + + +
+

 

+
+

 

+
+

+
+
+

 

+

 

+


+

+

string& + insert + ( + int + p0, + char + *str + );

+

string& + insert + ( + int + p0, + char + *str, + int count + );

+

string& + insert + ( + int + p0, + string str + );

+

string& + insert + ( + int + p0, + string str, + int off, + int count + );

+

string& + insert + ( + int + p0, + int + count, + char + ch + );

+

رشته str و يا كاراكتر ch را در موقعيت p0 از رشته درج مي‌كند. در نوع دوم و چهارم، count + تعداد كاراكترهايي را كه بايد كپي شوند مشخص مي‌كند. + off تعيين مي‌كند كه عمل كپي از كجاي رشته مبداء آغاز شود. در نوع +آخر، كاراكتر ch به تعداد count +بار در موقعيت p0 + كپي مي‌شود.

+
+ + + + + + + + +
+

 

+
+

 

+
+

+
+
+

+  

+


+

+

string& + erase + ();

+

string& + erase + ( intpos );

+

string& + erase + ( intpos, intcount );

+

نوع اول، محتويات +رشته را پاك مي‌كند. نوع دوم از موقعيت pos + تا انتهاي رشته را پاك مي‌كند. نوع سوم، از انديس + pos، به تعداد count كاراكتر را پاك مي‌كند.

+
+ + + + + + + + +
+

 

+
+

 

+
+

+
+
+

 

+


+

+

string& + substr + ( intpos );

+

string& + substr + ( intpos, intcount );

+

زير رشته‌اي از +رشته مورد نظر را برمي‌گرداند. نوع اول از موقعيت pos +تا انتهاي رشته را در يك رشته جديد كپي كرده و رشته جديد را برمي‌گرداند. نوع دوم +از موقعيت pos به تعداد count + كاراكتر را برمي‌گرداند.

+
+ + + + + + + + +
+

 

+
+

 

+
+

+
+
+

 

+


+

+

string& +  append + ( char + *str + );

+

string& + append + ( char + *str, + int count + );

+

string& +  append + ( + string str + );

+

string& +  append + ( + string str, + int off, + int count + );

+

string& +  append + ( int + count, + char + ch + );

+

رشته str + را به انتهاي +رشته اضافه مي‌كند. نوع اول و سوم كل str +را اضافه مي‌كنند. نوع دوم count كاراكتر از str را اضافه مي‌كند. نوع چهارم از انديس off +به تعداد count كاراكتر را اضافه مي‌كند. و نوع +پنجم كاراكتر ch را count +بار در انتهاي رشته تكرار مي‌كند.

+
+ + + + + + + + +
+

 

+
+

 

+
+

+
+
+

 

+


+

+

const char* c_str + ();

+

نوع string را به نوع char* + تبديل مي‌كند (نوع string + سر جاي خودش باقي مي‌ماند، تنها يك اشاره‌گر +موقتي برگردانده مي‌شود). اگر بخواهيد از شيء string +در توابعي كه با رشته‌هاي معمولي C (نوع char*) كار مي‌كنند استفاده كنيد، به اين تابع نياز داريد. البته +محتويات رشته‌اي كه به اين صورت برگدانده مي‌شود نبايد تغيير داده شود؛ براي +هرگونه تغيير در رشته بايد از خود string +استفاده كنيد.

+
+ + + + + + + + +
+

 

+
+

 

+
+

+
+
+

 

+

 

+


+

+

نوع string توابع ديگري نيز دارد كه در اينجا از توضيح آنها +خودداري مي‌كنم. براي اطلاعات بيشتر مي‌توانيد به منابعي كه معرفي كرده‌ام مراجعه +كنيد.

+

+  

+

 

+

 

+

 

+

فعلاً مطلب را در +هميجا تمام مي‌كنم. هنوز مطالب زيادي در مورد containerها و STL +وجود دارد؛ اميدوارم بعداً بيشتر در مورد آنها بنويسم.

+

همه اين مطالب، البته خيلي كامل‌تر در كتاب Thinking +In C++ وجود دارد. توصيه مي‌كنم حتماً آن را مطالعه كنيد.

+

در آخر يك مثال جامع در مورد مطالبي كه تا به حال گفته‌ام ميزنم كه در آن +از كلاس list و string و +fstream استفاده شده‌است. در اين مثال، +يك فايل متني خوانده شده و كليه كلمات آن همراه با تعداد تكرار آن‌ها چاپ مي‌شود.

+

 

+

 

+

//******************************

+

// CountWord.cpp sample file

+

//******************************

+

#include + <iostream> +

+

#include <iomanip>  // for +setw() and left

+

#include + <fstream> +

+

#include + <list> +

+

#include + <string> +

+

#include + <ctype.h> +

+

 

+

using namespace std;

+

 

+

struct Word

+

{

+

     +string w;

+

     +int count;

+

 

+

     +// this is necessary for sort() function

+

     +bool operator < ( Word &word )

+

     +{

+

           +return w < +word.w;

+

     +}

+

 

+

};

+

 

+

 

+

typedef list<Word> +WordList;

+

 

+

 

+

 

+

 

+

// This function gets an input stream and reads one

+

// word form the input stream.

+

string +GetWord ( istream &is +)

+

{

+

     +int c;

+

     +char ch;

+

     +string w;  // +an empty string

+

 

+

     +c = is.get();

+

     +if ( c == -1 ) // End Of File

+

           +return w;  +// return empty string

+

     +ch = (char)c;

+

 

+

     +if ( isalpha(ch) ) // ch is through a...z +or A...Z

+

     +{

+

           +while ( +isalnum ( ch ) +)

+

           +{

+

                 +w += ch;

+

     +            c = is.get();

+

                 +ch = c;

+

           +}

+

           +if ( c != -1 ) // if not end of file

+

                 +is.unget(); +// put back the last read character that is not +alphanumeric

+

     +}

+

     +else if ( isdigit(ch) )

+

     +{

+

           +while ( +isdigit(ch) +)

+

           +{

+

                 +w += ch;

+

     +            c = is.get();

+

                 +ch = c;

+

           +}

+

           +if ( c != -1 ) // if not end of file

+

                 +is.unget(); +// put back the last read character that is not a +digit

+

     +}

+

     +else if ( ch <= 32 ) // any control character or white space

+

           +w = ""; // empty string;

+

     +else  // other +characters

+

           +w = ch;

+

 

+

     +return w;

+

 

+

}

+

 

+

 

+

 

+

void main()

+

{

+

     +WordList words;

+

 

+

     +string filename;

+

     +cout << "Enter +file name to count its words : ";

+

     +cin >> filename;

+

 

+

     +ifstream infile ( filename.c_str() );

+

     +if ( !infile )

+

     +{

+

           +cout << "File +" << filename << " not +found!" << endl;

+

           +return;

+

     +}

+

 

+

     +Word word;

+

     +word.count = +1;

+

     +WordList::iterator i;

+

     +bool found;

+

     +while ( !infile.eof() )

+

     +{

+

           +word.w = +GetWord ( infile );

+

           +if ( word.w == "" )

+

                 +continue;

+

 

+

           +found = false;

+

           +for ( i = words.begin(); i != words.end(); i++ )

+

                 +if ( i->w == word.w )

+

                 +{

+

                       +i->count++;

+

                       +found = true;

+

                 +}

+

 

+

           +if ( found )

+

                 +continue;

+

 

+

           +// word.count is always 1

+

           +words.push_back ( +word );

+

     +}

+

 

+

     +infile.close();

+

 

+

     +words.sort ();

+

 

+

     +for ( i = words.begin(); i != words.end(); i++ )

+

           +cout << left << +setw(15) << i->w << i->count << +endl;

+

 

+

}

+

 

+

+  

+


+

+

Output:

+

Enter file name to count its words : + countword.cpp

+

!              + 7

+

"              + 10

+

#              + 6

+

&              + 2

+

(              + 42

+

)              + 42

+

+              + 8

+

-              + 7

+

.              + 28

+

/              + 32

+

1              + 5

+

15           +   1

+

32             + 1

+

:              + 3

+

;              + 49

+

<              + 30

+

=              + 27

+

>              + 13

+

A              + 1

+

End            + 1

+

Enter          1

+

File           2

+

GetWord        2

+

Of +             1

+

This           1

+

Word           4

+

WordList       3

+

Z              + 1

+

_          +     2

+

a              + 2

+

alphanumeric   1

+

always         1

+

an             + 2

+

and            + 1

+

any            + 1

+

back           3

+

begin          2

+

bool           2

+

c              + 11

+

ch             + 13

+

char           2

+

character      3

+

characters     1

+

cin            + 1

+

close          1

+

continue       2

+

control        1

+

count          6

+

cout           3

+

ctype          1

+

digit          1

+

else           3

+

empty          3

+

end            + 4

+

endl           2

+

eof            + 1

+

false          1

+

file           3

+

filename       4

+

for            + 4

+

form           1

+

found          5

+

fstream        1

+

function       2

+

get            + 3

+

gets           1

+

h              + 1

+

i              + 11

+

if             + 12

+

ifstream       1

+

include        6

+

infile         5

+

input          2

+

int            + 2

+

iomanip        1

+

iostream       1

+

is             + 11

+

isalnum        1

+

isalpha        1

+

isdigit        2

+

istream        1

+

iterator       1

+

its            + 1

+

last           2

+

left           1

+

list           2

+

main           1

+

name           1

+

namespace      1

+

necessary      1

+

not            + 5

+

of             + 2

+

one            + 1

+

operator       1

+

or             + 2

+

other          1

+

push           1

+

put            + 2

+

read           2

+

reads          1

+

return         5

+

setw           2

+

sort           2

+

space          1

+

std            + 1

+

str            + 1

+

stream         2

+

string         8

+

struct         1

+

that           2

+

the            + 3

+

this           1

+

through        1

+

to             + 1

+

true           1

+

typedef        1

+

unget          2

+

using          1

+

void           1

+

w              + 15

+

while          3

+

white          1

+

word           10

+

words          8

+

z              + 1

+

{              + 11

+

}              + 11

+ + + + + + + + +
+

 

+
+

 

+
+

+
+

 

+

 

+


+

+

در اين برنامه از +چند چيز استفاده شده‌است كه ممكن است قبلاً نديده باشيد.

+

در سر فايل <ctype.h> + توابعي وجود دارند كه براي بررسي نوع يك +كاراكتر به كار مي‌روند. در اين برنامه از توابع isalpha() و +isalnum() و isdigit() +استفاده شده است. تابع isalpha() در صورتي كه كاراكتر +مورد نظر در محدوده ‘a’ +تا ‘z’ +يا ‘A’ +تا ‘Z’ +قرار گيرد مقدار true برمي‌گرداند. تابع isdigit() در صورتي كه كاراكتر مورد نظر در محدوده ‘0’ تا ‘9’ قرار گيرد true برمي‌گرداند و تابع isaplnum() +در صورتي كه كاراكتر مورد نظر در يكي از دسته‌هاي قبلي قرار گيرد (يعني عدد يا حرف +باشد) true برمي‌گرداند.

+

در خط آخر برنامه +براي قالب بندي خروجي از left و setw() استفاده شده‌است. اين دو عبارت در سر فايل <iomanip> +تعريف شده‌اند. تابع setw() عرض ناحيه خروجي را +براي عبارت خروجي بعدي (تنها عبارت بعدي) تعيين مي‌كند؛ و لي به طور پيش‌فرض خروجي +در ناحيه تعيين شده از راست تراز مي‌شود. براي تراز خروجي از چپ، از عبارت left استفاده مي‌شود.

+

 

+

 

+

اين هم آخرين +مطلب:

+

براي پيدا كردن +مطلب مورد نظر در MSDN، بهترين راه استفاده از +index است. بعد از اجراي MSDN، از منوي Help گزينه Index زا انتخاب كنيد؛ پنجره Index +در سمت چپ نمايش داده مي‌شود. عبارت مورد نظرتان را در قسمت Look +for وارد كرده و در زير آن عنوان مورد نظر خود را انتخاب كنيد. مثلاً +براي گرفتن اطلاعات در مورد كلاس vector، +عبارت vector class را وارد مي‌كنيد:

+

 

+

+

 

+

همان‌طور كه مي‌بينيد +در زير عبارت vector class، زير مجموعه‌هايي وجود +كه دارند كه مربوط به همان عبارت مي‌باشند؛ مانند about +vector class و members. براي ديدن تمام اعضاء +كلاس vector مي‌توانيد روي گزينه members كليك كنيد.

+

حالا فرض كنيد مي‌خواهيد +نحوه استفاده از تابع sort از كلاس list راببينيد. به توابع عضو كلاس‌ها method +گفته مي‌شود. بنابراين شما بايد عبارت sort method +را وارد كنيد. حتي بايد به حروف بزرگ و كوچك نيز توجه داشته باشيد. بعد از انتخاب sort method در ليست پاييني، پنجره ديگري باز شده و از شما مي‌خواهد +كه انتخاب كنيد كه دنبال كدام تابع عضو sort +مي‌گرديد. در اين مورد بايد list::sort (C++ Std Lib) +را انتخاب كنيد (يعني تابع sort عضو كلاس list كه جزوي از كتابخانه استاندارد C++ +است). نكته آخر اينكه كلاس‌هاي istream، ostream و +string به ترتيب انواعي تعريف شده از +كلاس‌هاي basic_istream، basic_ostream و +basic_string هستند. بنابراين بايد در MSDN دنبال basic_string بگرديد نه string.

+

 

+

موفق باشيد. +خدانگه‌دار.

+

 

+

+  

+

منابع:

+

Bruce + Eckel, Chuck Allison - Thinking In C++, Pearson Prentice Hall, 2004

+

Microsoft + Developer Network Library, April 2003 Release

+

 

+

 

+

+  

+

محمد دهقان

+

تابستان 84

+

 

+

 

+

 

+
+ + diff --git a/STL_files/image001.gif b/STL_files/image001.gif new file mode 100644 index 0000000000000000000000000000000000000000..5852ff12b8138800ea8f4bb9ca95c0c59a924d44 GIT binary patch literal 84 zcmZ?wbhEHb{KCM*P|jee_)jW0Kdq!Zu_)C_!8bFxD8CrURq#(s%S=vXQ2fcl$N&U7 hAo3FfBSQm-$H2hE+ta`D^jrSLbGF>-{;bVl4FDQ(8BqWL literal 0 HcmV?d00001 diff --git a/STL_files/image001.jpg b/STL_files/image001.jpg new file mode 100644 index 0000000000000000000000000000000000000000..610e776cc9122b439d3b4ab4cd293689b2eb490c GIT binary patch literal 40597 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�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 literal 0 HcmV?d00001 diff --git a/STL_files/image002.gif b/STL_files/image002.gif new file mode 100644 index 0000000000000000000000000000000000000000..e617371b2d7302fe9bffe89e5e9297b286fe33f1 GIT binary patch literal 88 zcmZ?wbhEHboWaP%P|jee_)jW0Kdq!Zu_)C_!8bFxD8CrURq#(s%S=vXQ2fcl$N&U7 oj0}tn(-;{U8bCY-1}4Ft{*|ZS@-LpV--h6M*Z+--h6M*@Bg9<)&ORX8`}T? literal 0 HcmV?d00001 diff --git a/STL_files/image005.gif b/STL_files/image005.gif new file mode 100644 index 0000000000000000000000000000000000000000..1918c60540f01d25afe6132568a1a76f07976ebf GIT binary patch literal 88 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 literal 0 HcmV?d00001 diff --git a/msg.htm b/msg.htm new file mode 100644 index 0000000..107439f --- /dev/null +++ b/msg.htm @@ -0,0 +1,103 @@ + + + + + +سلام بچه‌ها + + + + + + +
+ +

سلام بچه‌ها. +بالاخره در مورد STL نوشتم. گذاشتم تو گروه +:

+ +

groups.yahoo.com/group/tucs82/Files/Guide/STL.chm

+ +

نامردين اگه +نخونين و ياد نگيرين! آخه دو هفته وقتمو گرفت. از حل كردن سؤالا هم كه خبري نيست.

+ +

راستي يه خبر. +احتمالاً شريف امسال ACM رو برگذار نمي‌كنه. +گروه‌هاي ايران بايد برن تو يكي از كشوراي مجاور امتحان بدن. مشكلي نيست. درستش مي‌كنيم.

+ +

عزت زياد.

+ +

 

+ +
+ + + +