موضوع مقاله: ایتریتور | مخاطب: عمومی | لحن: دانشنامه‌ای | ساختار: عنوان، مقدمه، 3 بخش، جمع‌بندی | مقاله: | # ایتریتور | مقدمه: معمولاً رابط برنامه‌نویسی یک گردآورد، امکان استفاده از انواع مختلفی از پیمایشگرها را می‌دهد. | ## بخش 1: ایتریتور | هر نوع خاص از پیمایشگر می‌تواند در انواع مختلف گردآورد، کاربرد و معنای یکسانی داشته باشد اما چگونگی پیاده‌سازی درونی آن برای هر گردآورد، وابستگی زیادی به ساختار درونی و چگونگی پیاده‌سازی گردآورد متناظرش دارد. اگرچه که پیمایشگر (ایتریتور) عملیات پیمایش را انجام می‌دهد و همچنین دسترسی به عناصر دادهٔ موجود در یک گردآورد را ممکن می‌سازد، اما خود ایتریشن را انجام نمی‌دهد (البته اگر دایرهٔ معنایی ایتریشن را خیلی گسترده در نظر نگیریم). می‌توان پیمایشگر را مشابه مکان‌نما در پایگاه داده در نظر گرفت و هر دو بر مبنای الگوی تکرار طراحی شده‌اند. تعریف پیمایشگرهای درونی پیمایشگرهای درونی، توابع مرتبهٔ بالاتری مانند Map و Reduce هستند که پیمایش کل گردآورد همراه با اعمال به‌نوبتِ تابع ورودی روی هر عنصر را پیاده‌سازی می‌کنند. پیمایشگرهای بیرونی و الگوی پیمایشگر یک پیمایشگر بیرونی را می‌توان مانند یک اشاره‌گر در نظر گرفت که قادر به انجام دادن دو عملیات مهم است: ارجاع دادن به یک عنصر خاص درون گردآورد مورد استفاده (که به آن دسترسی به عنصر می‌گوییم) و ایجاد در تغییر در خودش به گونه‌ای که به عنصر بعدیِ گردآورد اشاره کند (که به آن پیمایش عنصر می‌گوییم). همچنین باید راهی برای ایجاد یک پیمایشگر وجود داشته باشد که در ابتدا به یکی از عناصر اشاره کند. افزون بر این، باید تدبیری برای تشخیص این که همهٔ عناصر موجود در گردآورد پیمایش شده‌اند یا خیر، وجود داشته باشد. البته پیمایشگرها ممکن است که توانایی انجام عملیات‌های بیشتری داشته باشند یا رفتارهای متفاوتی از خود نشان دهند اما این موضوع به زبان برنامه‌نویسی و کاربرد مورد نظر بستگی دارد. هدف اصلی پیمایشگر این است که به کاربر این امکان را دهد که بدون توجه به ساختار درونی یک گردآورد، هر عنصر از گردآورد را پردازش کند. بدین ترتیب، گردآورد نیز این امکان را دارد که عناصر را به هر طریقی که بخواهد ذخیره کند در حالی که کاربر قادر است با آن صرفاً مانند یک دنباله یا فهرست ساده رفتار کند. معمولاً تلاش می‌شود که یک کلاس پیمایشگر شدیداً متناسب با کلاس گردآورد مربوطه طراحی شود. | ## بخش 2: ایتریتور | اما باید توجه کرد که شمارندهٔ حلقه فقط قابلیت پیمایش عناصر را دارد و امکان دسترسی به عنصر را ندارد. مولدها یکی از راه‌های پیاده‌سازی پیمایشگرها استفاده از شکلی محدود از هَم‌رَویه است که با نام مولد شناخته می‌شود. برخلاف یک رویه، یک هم‌رویهٔ مولد می‌تواند به جای این که فقط یک بار مقادیر خروجی را برای فراخوانندهٔ خود برگرداند، آنها را چندین بار به فراخواننده خود واگذار کند. بیشتر پیمایشگرها به‌طور طبیعی به عنوان مولد قابل بیان هستند، اما از آنجا که مولدها حالت محلی خود (یعنی مقدار متغیرهای تابع و …) را در بین فراخوانی‌ها حفظ می‌کنند، آنها به‌طور ویژه برای پیمایشگرهای پیچیده و حالتمند مانند پیمایشگرهای درخت مناسب هستند. در معنای اصطلاحات «مولد» و «ایتریتور (پیمایشگر)» که بین نویسندگان و زبان‌ها متفاوت است، تفاوت‌ها و تمایزهای ظریفی وجود دارد. در پایتون، یک مولد، سازنده‌ی پیمایشگر است یا به عبارت دیگر، تابعی است که یک پیمایشگر برمی‌گرداند. ممکن است که در حقیقت، یک شیء پیمایشگر وجود داشته باشد، اما اگر هم چنین باشد، در کد منبع زبان قرار نمی‌گیرد. در زبان‌های برنامه‌نویسی مختلف ++C زبان ++C در کتابخانهٔ استاندارد خود از پیمایشگرها استفاده گسترده‌ای می‌کند و چندین دسته از پیمایشگرها را در رپرتوار عملیاتی که مجاز هستند متفاوت توصیف می‌کند. به منظور افزایش قابلیت‌ها، این دسته‌ها شامل پیمایشگرهای جلورونده، پیمایشگرهای دوطرفه و پیمایشگرهای با دسترسی تصادفی می‌شوند. پیمایشگرها، تعمیمی بر اشاره‌گرهای به عناصر یک آرایه هستند (در واقع خود این اشاره‌گرها می‌توانند به عنوان یک پیمایشگر استفاده شوند)، و نحوهٔ استفاده از آنها به گونه‌ای طراحی شده‌است که مانند محاسبات اشاره‌گر در زبان C باشد. به این گونه که از * و -> برای ارجاع به عنصری که پیمایشگر به آن اشاره می‌کند استفاده می‌شود و از عملگرهای ریاضی روی اشاره‌گر مانند ++ برای تغییر دادن در پیمایشگر در هنگام پیمایش یک گردآورد استفاده می‌شود. | ## بخش 3: ایتریتور | معمولاً برای پیمایش با استفاده از پیمایشگرها، نیاز به یک پیمایشگر متحرک و دو پیمایشگر ثابت است که این دو، نقش محدودکنندهٔ بازهٔ پیمایش مورد نظر را دارند. فاصلهٔ بین پیمایشگرهای محدودکننده، از نظر تعداد دفعاتی که لازم است عملگر ++ روی حد پایین عمل کند تا آن را حد بالا برساند، برابر است با تعداد عناصری که در بازهٔ مورد نظر قرار دارند؛ بنابراین تعداد پیمایشگرهای متمایز دقیقاً یکی از تعداد عناصر موجود در بازهٔ مورد پیمایش بیشتر است. این‌طور قرارداد شده‌است که پیمایشگر مربوط به حد پایین به اولین عنصر موجود در بازهٔ پیمایش اشاره می‌کند اما پیمایشگر مربوط به حد بالا به هیچ عنصری درون بازهٔ پیمایش اشاره نمی‌کند، بلکه دقیقاً یک واحد فراتر از انتهای بازه است. توجه شود که end به هیچ عنصری از گردآورد ارجاع نمی‌دهد اما یک پیمایشگر معتبر است و می‌توان سایر پیمایشگرها را با آن مقایسه کرد. دستهٔ پیمایشگر (و در نتیجه عملیات تعریف شده برای آن) معمولاً به نوع گردآورد بستگی دارد، به عنوان مثال آرایه‌ها یا وکتورها پیمایشگر دسترسی تصادفی را ارائه می‌دهند، اما مجموع‌ه‌ها (که با یک ساختار پیوندی پیاده‌سازی شده‌اند) فقط پیمایشگرهای دوطرفه را ارائه می‌دهند. به عنوان مثال نوع std::vector<T> امکان پیمایش یا استفاده از اشاره‌گرهای (خام) عناصر آن (با نوع *<T>) یا مقادیر با نوع خاص std::vector<T>::iterator و نوع دیگری برای "پیمایشگرهای معکوس" ارائه شده‌است، که عملیات آنها به گونه‌ای تعریف می‌شود که الگوریتمی که یک پیمایش معمول (رو به جلو) را انجام می‌دهد، در صورت فراخوانی با پیمایشگرهای معکوس، پیمایش را به ترتیب معکوس انجام می‌دهد. اینها متدهای کلاس گردآورد هستند، اما علاوه بر این برای تعیین عملکرد مورد نظر به یک یا چند مقدار پیمایشگر نیاز دارند. در حالی که امکان دارد چندین پیمایشگر به‌طور همزمان به یک ظرف اشاره داشته باشند، عملیات اصلاح ساختار ممکن است برخی از مقادیر پیمایشگرها را فاقد اعتبار کند (استاندارد برای هر مورد مشخص می‌کند که آیا این ممکن است). استفاده از پیمایشگرِ نامعتبر خطایی است که منجر به رفتار نامشخص می‌شود، و سامانه در زمان اجرا برای چنین خطاهایی لزوماً سیگنال نمی‌دهد. هنگام استفاده، آنها باید با پیمایشگرهای موجود مقداردهی شوند، معمولاً begin و end که محدوده تکرار را تعریف می‌کند. | ## جمع‌بندی | وات مستندات برخط گنو جی‌سی‌سی برای پیمایشگرها کتابخانه‌ی پیمایشگرهای Boost C++ اینترفیس جاوا PHP: ایتریشن روی اشیاء مستندات کامل پیمایشگرهای کتابخانه‌ٔ استاندارد سی++ پیمایشگرهای STL پیمایشگرها چه هستند؟