021-88881776

آموزش مرجع و کتابخانه‌ها در C++

آموزش C++ یکی از مهم‌ترین مهارت‌ها برای برنامه‌نویسانی است که قصد دارند در توسعه نرم‌افزارهای سطح بالا و بهینه فعالیت کنند. یکی از اجزای کلیدی این زبان، مرجع و کتابخانه‌های آن است که مجموعه‌ای از توابع و کلاس‌های از پیش تعریف‌شده را فراهم می‌کنند. در این مقاله، مرجع و کتابخانه‌ها در C++ را بررسی کرده و نحوه استفاده از آن‌ها را توضیح می‌دهیم.

مرجع و کتابخانه‌ها در C++

C++ دارای یک مجموعه‌ای گسترده از کتابخانه‌ها و منابع مرجع است که به برنامه‌نویسان کمک می‌کند تا برنامه‌هایی سریع، کارآمد و مقیاس‌پذیر بنویسند. مرجع C++ شامل مستندات، کلمات کلیدی، توابع و کلاس‌هایی است که برای توسعه نرم‌افزارهای مختلف از جمله سیستم‌های تعبیه‌شده، بازی‌سازی و برنامه‌های سازمانی به کار می‌روند. در این بخش، به بررسی مرجع C++ و برخی از مهم‌ترین کتابخانه‌های استاندارد آن خواهیم پرداخت. دارای یک مجموعه غنی از کتابخانه‌ها است که به توسعه‌دهندگان کمک می‌کنند تا برنامه‌های خود را به‌طور کارآمدتر و با استفاده از کدهای بهینه‌تر بنویسند. در ادامه، بخش‌های مهم این مرجع را بررسی می‌کنیم.

مرجع C++ (C++ Reference)

مرجع C++ شامل مستندات جامعی از تمامی قابلیت‌های این زبان است. این مرجع شامل توضیحات مربوط به سینتکس، توابع، کلاس‌ها و دیگر عناصر کلیدی C++ است. به کمک این منابع، برنامه‌نویسان می‌توانند اطلاعات دقیقی درباره نحوه استفاده از قابلیت‌های مختلف زبان به دست آورند. علاوه بر این، مرجع C++ شامل توضیحات مربوط به استانداردهای مختلف این زبان، نسخه‌های مختلف آن و تغییراتی که در هر نسخه ایجاد شده است نیز می‌شود. بهترین منابع برای مرجع C++ عبارت‌اند از:

cplusplus.com: شامل توضیحات دقیق درباره توابع، کلاس‌ها و مثال‌های متنوع.

cppreference.com: یک منبع دقیق و جامع از استانداردهای مختلف C++.

مستندات رسمی C++: ارائه‌شده توسط سازمان‌های استاندارد، شامل جزئیات کامل درباره ویژگی‌های زبان. C++ شامل مستندات جامعی از تمامی قابلیت‌های این زبان است. این مرجع شامل توضیحات مربوط به سینتکس، توابع، کلاس‌ها و دیگر عناصر کلیدی C++ است. بهترین منابع برای مرجع C++ عبارت‌اند از:

کلمات کلیدی (C++ Keywords)

کلمات کلیدی در C++ شامل مجموعه‌ای از واژه‌های رزرو شده است که برای تعریف ساختارهای مختلف زبان استفاده می‌شوند. این کلمات کلیدی نقش اساسی در ساختار و نحوه عملکرد کدها دارند و نمی‌توانند به‌عنوان نام متغیرها، کلاس‌ها یا توابع مورد استفاده قرار گیرند. در ادامه، کلمات کلیدی مهم C++ را همراه با توضیحات و کاربرد آن‌ها بررسی می‌کنیم:

کلمات کلیدی مرتبط با انواع داده‌ای

int، float، double، char، bool: برای تعریف انواع داده‌ای عدد صحیح، اعشاری، کاراکتری و بولی استفاده می‌شوند.

void: نشان‌دهنده عدم بازگشت مقدار در توابع است.

wchar_t: برای نمایش کاراکترهای یونی‌کد (Unicode) استفاده می‌شود.

کلمات کلیدی مرتبط با کنترل جریان برنامه

if، else، switch، case، default: برای ایجاد شرط‌های منطقی و کنترل اجرای دستورات استفاده می‌شوند.

for، while، do-while: حلقه‌های تکراری را برای اجرای مداوم بخش خاصی از کد فراهم می‌کنند.

break: باعث خروج از یک حلقه یا ساختار switch می‌شود.

continue: اجرای یک تکرار حلقه را متوقف کرده و به تکرار بعدی می‌رود.

return: مقدار بازگشتی از یک تابع را مشخص می‌کند.

کلمات کلیدی مرتبط با تعریف کلاس‌ها و اشیا

class، struct، union: برای تعریف کلاس‌ها، ساختارها و اتحادیه‌ها استفاده می‌شوند.

public، private، protected: سطح دسترسی اعضای کلاس را مشخص می‌کنند.

this: اشاره‌گری که به نمونه فعلی کلاس اشاره دارد.

new، delete: برای تخصیص و آزادسازی حافظه به‌صورت پویا استفاده می‌شوند.

friend: به توابع یا کلاس‌های دیگر اجازه دسترسی به اعضای خصوصی و محافظت‌شده یک کلاس را می‌دهد.

virtual: برای تعریف توابع مجازی در کلاس‌های پایه استفاده می‌شود.

override: اطمینان حاصل می‌کند که یک تابع در کلاس مشتق‌شده، تابع پایه را بازنویسی می‌کند.

final: جلوگیری از بازنویسی مجدد یک کلاس یا تابع.

کلمات کلیدی مرتبط با فضای نام و محدوده

namespace: برای ایجاد فضاهای نام جهت جلوگیری از تداخل نام‌ها استفاده می‌شود.

using: برای وارد کردن فضای نام یا استفاده از نوع داده‌ای خاص.

static: برای ایجاد متغیرها یا توابعی که در طول اجرای برنامه مقدارشان حفظ می‌شود.

extern: برای اعلام متغیرهای خارجی که در فایل‌های دیگر تعریف شده‌اند.

کلمات کلیدی مرتبط با مدیریت استثناها

try، catch، throw: برای مدیریت استثناها (Exception Handling) در برنامه‌نویسی استفاده می‌شوند.

کلمات کلیدی مرتبط با توابع و اشاره‌گرها

inline: به کامپایلر پیشنهاد می‌دهد که کد تابع را مستقیماً جایگزین فراخوانی‌های آن کند.

typedef: برای تعریف نام مستعار برای انواع داده‌ای به کار می‌رود.

constexpr: ثابت‌هایی را مشخص می‌کند که مقدارشان در زمان کامپایل تعیین می‌شود.

mutable: امکان تغییر مقدار متغیرهای عضو یک کلاس const را فراهم می‌کند.

volatile: مشخص می‌کند که مقدار یک متغیر ممکن است بدون اطلاع برنامه تغییر کند.

این کلمات کلیدی بخش مهمی از زبان C++ را تشکیل می‌دهند و دانستن کاربرد دقیق آن‌ها به برنامه‌نویسان کمک می‌کند تا کدهای بهینه‌تر و خواناتری بنویسند.

کتابخانه‌های استاندارد در C++

کتابخانه‌های استاندارد C++ مجموعه‌ای از ابزارهای ضروری را برای برنامه‌نویسان فراهم می‌کنند تا بتوانند عملیات مختلفی را بدون نیاز به پیاده‌سازی مجدد انجام دهند. این کتابخانه‌ها شامل انواع داده‌ای، ورودی و خروجی، مدیریت حافظه، پردازش رشته‌ها، عملیات ریاضی، کار با فایل‌ها و الگوریتم‌های مختلف هستند.

کتابخانه‌های استاندارد به دو دسته کلی تقسیم می‌شوند:

کتابخانه‌های استاندارد هدر (Standard Header Libraries):

این کتابخانه‌ها شامل فایل‌های هدر هستند که مستقیماً در کد برنامه قرار می‌گیرند و به صورت <header> استفاده می‌شوند. برخی از مهم‌ترین این کتابخانه‌ها عبارتند از:

<iostream> برای عملیات ورودی و خروجی استاندارد

<fstream> برای کار با فایل‌ها

<cmath> برای انجام محاسبات ریاضی

<string> برای پردازش رشته‌ها

<vector> برای مدیریت آرایه‌های پویا

<algorithm> برای پیاده‌سازی الگوریتم‌های مرتب‌سازی و جستجو

کتابخانه‌های استاندارد قالبی (Standard Template Library – STL):

این مجموعه شامل قالب‌هایی (Templates) است که برای مدیریت داده‌ها و الگوریتم‌های مختلف استفاده می‌شوند. STL دارای سه مؤلفه اصلی است:

کانتینرها (Containers): مانند vector، list، map و set که برای ذخیره و مدیریت داده‌ها استفاده می‌شوند.

الگوریتم‌ها (Algorithms): شامل توابعی مانند sort، find و search برای پردازش داده‌ها.

آداپتورهای تابع (Function Adapters): شامل توابعی برای تغییر رفتار توابع استاندارد.

استفاده از این کتابخانه‌ها باعث افزایش کارایی، کاهش پیچیدگی و افزایش قابلیت نگهداری کدهای C++ می‌شود. در ادامه، برخی از مهم‌ترین کتابخانه‌های استاندارد C++ را بررسی خواهیم کرد.

کتابخانه <iostream> (C++ <iostream>)

کتابخانه <iostream> در C++ یکی از کتابخانه‌های پایه‌ای و ضروری است که برای انجام عملیات ورودی و خروجی (I/O) طراحی شده است. این کتابخانه به برنامه‌نویسان این امکان را می‌دهد که به راحتی داده‌ها را از کاربر دریافت کنند (ورودی) و اطلاعات را به کاربر نمایش دهند (خروجی). این کتابخانه برای هر برنامه‌ای که به تعامل با کاربر از طریق کنسول نیاز دارد، ضروری است.

توابع و اشیاء مهم در کتابخانه <iostream>

cin (برای دریافت ورودی از کاربر)

cin یک شیء است که برای دریافت ورودی از کاربر به کار می‌رود. با استفاده از cin، می‌توان مقادیر مختلف را از کاربر دریافت کرده و آن‌ها را در متغیرهای برنامه ذخیره کرد. cin به صورت پیش‌فرض از ورودی استاندارد (معمولاً صفحه کلید) مقادیر را دریافت می‌کند.

مثال:

#include <iostream>
using namespace std;

int main() {
    int age;
    cout << "Enter your age: ";
    cin >> age;  // دریافت ورودی از کاربر
    cout << "Your age is " << age << endl;
    return 0;
}

cout (برای نمایش خروجی به کاربر)

cout یک شیء است که برای نمایش اطلاعات و خروجی به کاربر استفاده می‌شود. داده‌هایی که می‌خواهیم به کاربر نشان دهیم، باید با استفاده از cout به کنسول ارسال شوند. cout به صورت پیش‌فرض برای نمایش خروجی به کنسول (صفحه نمایش) استفاده می‌شود.

مثال:

#include <iostream>
using namespace std;

int main() {
    cout << "Hello, World!" << endl;  // نمایش پیامی در کنسول
    return 0;
}

cerr (برای نمایش پیغام‌های خطا)

cerr مشابه cout است، اما با این تفاوت که برای نمایش پیغام‌های خطا استفاده می‌شود. پیام‌های خطا معمولاً به طور جداگانه از سایر خروجی‌ها نمایش داده می‌شوند. cerr به طور پیش‌فرض به خروجی استاندارد خطا (معمولاً کنسول) ارسال می‌شود و معمولاً از آن برای نمایش خطاهای بحرانی و مهم استفاده می‌شود.

مثال:

#include <iostream>
using namespace std;

int main() {
    cerr << "An error occurred!" << endl;  // نمایش پیغام خطا
    return 1;  // برگرداندن کد خطا
}

کاربردهای مهم دیگر

1. ورودی چندگانه از کاربر

می‌توان از cin برای دریافت ورودی‌های متعدد از کاربر استفاده کرد. به این صورت که می‌توان چندین متغیر را به طور هم‌زمان از کاربر دریافت کرده و از آن‌ها استفاده کرد.

مثال:

#include <iostream>
using namespace std;

int main() {
    int num1, num2;
    cout << "Enter two numbers: ";
    cin >> num1 >> num2;  // دریافت دو عدد از کاربر
    cout << "Sum of the numbers: " << num1 + num2 << endl;
    return 0;
}

2. دریافت ورودی به صورت رشته‌ای (String)

علاوه بر انواع داده‌های عددی، می‌توان از cin برای دریافت رشته‌های متنی نیز استفاده کرد. برای دریافت رشته‌ها، باید از cin به صورت خاص استفاده کرد، زیرا cin به طور پیش‌فرض ورودی را تا اولین فاصله (space) دریافت می‌کند.

مثال:

#include <iostream>
using namespace std;

int main() {
    string name;
    cout << "Enter your name: ";
    getline(cin, name);  // دریافت رشته کامل با استفاده از getline
    cout << "Hello, " << name << "!" << endl;
    return 0;
}

3. استفاده از flush برای پاکسازی بافر خروجی

در برخی مواقع ممکن است نیاز باشد تا خروجی بلافاصله به کنسول نمایش داده شود، حتی اگر خط جدید (endl) در انتهای دستور خروجی وجود نداشته باشد. برای این کار می‌توان از flush استفاده کرد.

مثال:

#include <iostream>
using namespace std;

int main() {
    cout << "Processing..." << flush;  // بدون ایجاد خط جدید و پاکسازی بافر
    // برخی عملیات‌ها که نیاز به زمان دارند
    cout << endl;  // بعد از اتمام عملیات، خط جدید
    return 0;
}

کتابخانه <iostream> ابزار بسیار مهم و اساسی برای انجام عملیات ورودی و خروجی در C++ است. با استفاده از این کتابخانه می‌توان داده‌ها را از کاربر دریافت کرد و به راحتی اطلاعات را به کنسول نمایش داد. توابع cin، cout و cerr به ترتیب برای دریافت ورودی، نمایش خروجی و نمایش پیغام‌های خطا استفاده می‌شوند. در کنار این توابع، قابلیت‌هایی مانند getline() برای دریافت رشته‌ها و flush برای کنترل بافر خروجی نیز وجود دارند که کار با داده‌ها را آسان‌تر می‌کنند. این کتابخانه در تمام برنامه‌های C++ که با ورودی و خروجی سر و کار دارند، ضروری و حیاتی است.

کتابخانه <fstream> (C++ <fstream>)

کتابخانه <fstream> در C++ برای انجام عملیات ورودی و خروجی (I/O) بر روی فایل‌ها طراحی شده است. این کتابخانه به شما این امکان را می‌دهد که به راحتی داده‌ها را از فایل‌ها بخوانید و یا داده‌هایی را به فایل‌ها بنویسید. این عملیات بسیار مهم در برنامه‌نویسی کاربردهای زیادی دارد، از جمله ذخیره‌سازی داده‌ها، بارگذاری تنظیمات، یا ذخیره‌سازی خروجی‌های یک برنامه در فایل‌ها.

توابع و کلاس‌های مهم در کتابخانه <fstream>

ifstream (برای خواندن داده‌ها از فایل)

کلاس ifstream (input file stream) برای خواندن داده‌ها از یک فایل استفاده می‌شود. با استفاده از این کلاس، می‌توان داده‌های موجود در یک فایل متنی را به برنامه وارد کرد. این کلاس به طور پیش‌فرض فایل را برای خواندن باز می‌کند.

مثال:

#include <fstream>
#include <iostream>
using namespace std;

int main() {
    ifstream myFile("example.txt");
    string line;
    if (myFile.is_open()) {
        while (getline(myFile, line)) {  // خواندن هر خط از فایل
            cout << line << endl;
        }
        myFile.close();
    } else {
        cout << "Unable to open file";
    }
    return 0;
}

ofstream (برای نوشتن داده‌ها به فایل)

کلاس ofstream (output file stream) برای نوشتن داده‌ها به یک فایل استفاده می‌شود. با این کلاس، می‌توان داده‌ها را به یک فایل متنی ذخیره کرد. اگر فایل وجود نداشته باشد، این کلاس به طور خودکار یک فایل جدید ایجاد می‌کند.

مثال:

#include <fstream>
#include <iostream>
using namespace std;

int main() {
    ofstream myFile("example.txt");
    if (myFile.is_open()) {
        myFile << "Hello, file!";  // نوشتن داده‌ها به فایل
        myFile.close();
    } else {
        cout << "Unable to open file";
    }
    return 0;
}

fstream (برای خواندن و نوشتن داده‌ها در یک فایل)

کلاس fstream ترکیبی از ifstream و ofstream است. این کلاس به شما اجازه می‌دهد که همزمان برای خواندن و نوشتن در یک فایل استفاده کنید. این ابزار بسیار مفید است زمانی که نیاز به دسترسی هم‌زمان به داده‌های یک فایل به صورت خواندنی و نوشتنی دارید.

مثال:

#include <fstream>
#include <iostream>
using namespace std;

int main() {
    fstream myFile("example.txt", ios::in | ios::out);
    string content;
    if (myFile.is_open()) {
        getline(myFile, content);  // خواندن داده از فایل
        cout << "File content: " << content << endl;
        myFile << "\nAppended text.";  // اضافه کردن داده به فایل
        myFile.close();
    } else {
        cout << "Unable to open file";
    }
    return 0;
}

نحوه کار با فایل‌ها

باز کردن فایل‌ها: برای استفاده از هر سه کلاس (ifstream، ofstream، و fstream)، ابتدا باید فایل مورد نظر را با استفاده از متد open() باز کنید. علاوه بر این، می‌توان هنگام تعریف شیء از سازنده مربوطه به صورت مستقیم فایل را باز کرد.

بررسی اینکه فایل به درستی باز شده است: بعد از باز کردن فایل، همیشه باید بررسی کنید که آیا فایل به درستی باز شده است یا خیر. این کار با استفاده از متد is_open() انجام می‌شود که مقدار true را بر می‌گرداند اگر فایل به درستی باز شده باشد و false در غیر این صورت.

خواندن داده‌ها از فایل: برای خواندن داده‌ها از فایل، می‌توانید از متدهایی مانند getline() برای خواندن خط به خط یا از عملگر >> برای خواندن ورودی به صورت جداسازی شده استفاده کنید.

نوشتن داده‌ها به فایل: برای نوشتن داده‌ها به فایل، می‌توانید از عملگر << برای ارسال داده‌ها به فایل استفاده کنید. توجه داشته باشید که اگر از ofstream استفاده می‌کنید، محتوای فایل از ابتدا نوشته می‌شود، اما اگر از fstream با حالت ios::app استفاده کنید، داده‌ها به انتهای فایل اضافه خواهند شد.

بستن فایل: پس از پایان عملیات روی فایل، باید آن را با استفاده از متد close() ببندید. این کار باعث آزاد شدن منابع و حفظ تمام تغییرات در فایل می‌شود.

نکات مهم

حالت‌های مختلف باز کردن فایل‌ها:

ios::in : برای باز کردن فایل در حالت خواندن.
ios::out : برای باز کردن فایل در حالت نوشتن.
ios::app : برای اضافه کردن داده به انتهای فایل.
ios::ate : برای باز کردن فایل و قرار دادن اشاره‌گر در انتهای فایل.
ios::binary : برای کار با فایل‌ها به صورت باینری.

خطاها در هنگام کار با فایل‌ها:

هنگام کار با فایل‌ها، ممکن است مشکلاتی پیش بیاید مانند اینکه فایل وجود نداشته باشد یا دسترسی به آن مجاز نباشد. برای مدیریت این خطاها باید از متدهای is_open() و fail() استفاده کرد.

مثال:

#include <fstream>
#include <iostream>
using namespace std;

int main() {
    ifstream myFile("nonexistent.txt");
    if (!myFile) {
        cout << "Error: File could not be opened!" << endl;
    } else {
        cout << "File opened successfully!" << endl;
    }
    return 0;
}

کتابخانه <fstream> در C++ ابزار بسیار مهمی برای انجام عملیات ورودی و خروجی روی فایل‌ها است. با استفاده از کلاس‌های ifstream، ofstream و fstream، می‌توان داده‌ها را از فایل‌ها خواند، به فایل‌ها نوشت و حتی عملیات خواندن و نوشتن را به صورت همزمان انجام داد. این کتابخانه در هر برنامه‌ای که نیاز به ذخیره‌سازی یا بارگذاری داده‌ها از فایل‌ها داشته باشد، ضروری است.

کتابخانه <cmath> (C++ <cmath>)

کتابخانه <cmath> در C++ یک کتابخانه استاندارد است که به برنامه‌نویسان این امکان را می‌دهد تا به راحتی عملیات ریاضی مختلفی مانند جذر، توان، و عملیات مثلثاتی را انجام دهند. این کتابخانه، که در واقع یک نسخه به‌روز شده از کتابخانه <math.h> در C است، با توابع خود برای انجام محاسبات ریاضی پیچیده به‌طور مستقیم در زبان C++ مفید است.

توابع مهم در کتابخانه <cmath>

کتابخانه <cmath> مجموعه‌ای از توابع را فراهم می‌کند که عملیات ریاضی را به‌طور ساده و سریع انجام می‌دهند. در اینجا برخی از توابع پرکاربرد آن را معرفی می‌کنیم:

sqrt(x)

این تابع برای محاسبه جذر عدد استفاده می‌شود. ورودی آن باید یک عدد غیرمنفی باشد و خروجی آن جذر آن عدد است.

مثال:

double result = sqrt(25);  // جذر 25
cout << "Square root of 25 is " << result << endl;  // 5

pow(x, y)

این تابع برای محاسبه توان استفاده می‌شود. ورودی اول (x) پایه و ورودی دوم (y) نمای عدد است. خروجی این تابع x به توان y خواهد بود.

مثال:

double result = pow(2, 3);  // 2 به توان 3
cout << "2 raised to the power of 3 is " << result << endl;  // 8

sin(x), cos(x), tan(x)

این توابع برای انجام عملیات مثلثاتی استفاده می‌شوند. ورودی این توابع زاویه است که باید به رادیان داده شود (در C++ زاویه‌ها به رادیان وارد می‌شوند، نه به درجه).

مثال:

double angle = 3.14159 / 4;  // 45 درجه به رادیان
cout << "Sin(45 degrees) is " << sin(angle) << endl;
cout << "Cos(45 degrees) is " << cos(angle) << endl;
cout << "Tan(45 degrees) is " << tan(angle) << endl;

abs(x)

این تابع برای گرفتن مقدار مطلق یک عدد استفاده می‌شود. اگر عدد ورودی منفی باشد، خروجی مثبت خواهد بود.

مثال:

int num = -10;
cout << "Absolute value of -10 is " << abs(num) << endl;  // 10

exp(x)

این تابع برای محاسبه عدد e (که تقریباً برابر با 2.71828 است) به توان x استفاده می‌شود.

مثال:

double result = exp(1);  // e به توان 1
cout << "e raised to the power of 1 is " << result << endl;  // 2.71828

log(x)

این تابع برای محاسبه لگاریتم طبیعی (logarithm with base e) یک عدد استفاده می‌شود.

مثال:

double result = log(10);  // لگاریتم طبیعی 10
cout << "Natural logarithm of 10 is " << result << endl;  // 2.30259

log10(x)

این تابع برای محاسبه لگاریتم با پایه 10 (logarithm with base 10) استفاده می‌شود.

مثال:

double result = log10(100);  // لگاریتم پایه 10 از 100
cout << "Logarithm base 10 of 100 is " << result << endl;  // 2

نکات مهم در استفاده از کتابخانه <cmath>

رادیان به جای درجه: به یاد داشته باشید که تمامی توابع مثلثاتی (مانند sin(), cos(), tan()) ورودی را به رادیان می‌پذیرند. بنابراین اگر می‌خواهید زاویه را به درجه وارد کنید، باید آن را به رادیان تبدیل کنید:

double degree = 45;
double radian = degree * (M_PI / 180);  // تبدیل درجه به رادیان
cout << "Sin(45 degrees) is " << sin(radian) << endl;

محدودیت‌ها: برخی از توابع مانند sqrt() فقط برای مقادیر غیرمنفی معتبر هستند. اگر ورودی منفی باشد، نتیجه ممکن است غیرتعریف (NaN) باشد. بنابراین برای اطمینان از درستی ورودی، ممکن است بخواهید قبل از استفاده از این توابع از بررسی شرایط استفاده کنید:

double number = -9;
if (number >= 0) {
    cout << "Square root is " << sqrt(number) << endl;
} else {
    cout << "Invalid input for square root" << endl;
}

دقت حسابی: در محاسبات ریاضی، دقت ممکن است تحت تأثیر برخی عملیات قرار گیرد. برای مثال، توابع مثلثاتی ممکن است نتایج دقیقی نداشته باشند و ممکن است با خطای گرد کردن مواجه شوید.

مثال کامل از توابع <cmath>:

#include <cmath>
#include <iostream>
using namespace std;

int main() {
    double number = 25;
    double base = 2;
    double exponent = 3;
    
    // جذر
    double sqrtResult = sqrt(number);
    cout << "Square root of " << number << " is " << sqrtResult << endl;

    // توان
    double powResult = pow(base, exponent);
    cout << base << " raised to the power of " << exponent << " is " << powResult << endl;

    // عملیات مثلثاتی
    double angle = 3.14159 / 4;  // 45 درجه به رادیان
    cout << "Sin(45 degrees) is " << sin(angle) << endl;
    cout << "Cos(45 degrees) is " << cos(angle) << endl;
    cout << "Tan(45 degrees) is " << tan(angle) << endl;

    // مقدار مطلق
    int negativeNum = -100;
    cout << "Absolute value of " << negativeNum << " is " << abs(negativeNum) << endl;

    return 0;
}

این کد تمام توابع ذکر شده در بالا را برای محاسبه جذر، توان، عملیات مثلثاتی، و مقدار مطلق استفاده می‌کند. شما می‌توانید با تغییر ورودی‌ها و آزمایش نتایج مختلف، بیشتر با نحوه استفاده از توابع <cmath> آشنا شوید.
کتابخانه <cmath> ابزارهای بسیار مفیدی را برای انجام انواع محاسبات ریاضی فراهم می‌کند. از جذر و توان گرفته تا عملیات مثلثاتی، این کتابخانه به برنامه‌نویسان C++ کمک می‌کند تا بتوانند محاسبات پیچیده را با دقت و سهولت انجام دهند.

کتابخانه <string> (C++ <string>)

کتابخانه <string> در C++ یک کتابخانه استاندارد است که برای کار با رشته‌های متنی (strings) استفاده می‌شود. این کتابخانه قابلیت‌های گسترده‌ای برای مدیریت رشته‌ها، انجام عملیات مختلف روی آن‌ها، و دسترسی به داده‌های متنی فراهم می‌کند. یکی از مزیت‌های اصلی استفاده از <string> در C++ این است که این کتابخانه به‌طور خودکار حافظه را مدیریت می‌کند، به این معنی که برنامه‌نویس نیازی به نگرانی در مورد تخصیص و آزادسازی حافظه برای رشته‌ها ندارد (برخلاف رشته‌ها در زبان C که از آرایه‌های کاراکتری استفاده می‌کنند).

توابع مهم در کتابخانه <string>

کتابخانه <string> مجموعه‌ای از توابع را ارائه می‌دهد که به‌وسیله آن‌ها می‌توان عملیات مختلفی روی رشته‌ها انجام داد. در اینجا به توضیح چند تابع مهم می‌پردازیم:

length()

تابع length() طول یک رشته را برمی‌گرداند، به‌عبارت دیگر تعداد کاراکترهای موجود در آن را محاسبه می‌کند.

مثال:

#include <string>
#include <iostream>
using namespace std;

int main() {
    string name = "Alice";
    cout << "Name length: " << name.length() << endl;  // خروجی: 5
    return 0;
}

substr()

تابع substr() به شما این امکان را می‌دهد که یک زیررشته از یک رشته استخراج کنید. این تابع دو پارامتر دارد: اولین پارامتر نشان‌دهنده موقعیت شروع زیررشته و پارامتر دوم طول زیررشته است.

مثال:

#include <string>
#include <iostream>
using namespace std;

int main() {
    string sentence = "Hello, World!";
    string sub = sentence.substr(7, 5);  // استخراج "World"
    cout << "Extracted substring: " << sub << endl;  // خروجی: World
    return 0;
}

append()

تابع append() برای اضافه کردن رشته‌ای به انتهای رشته دیگر استفاده می‌شود. این تابع می‌تواند یک رشته یا تعدادی از کاراکترها را به رشته اصلی اضافه کند.

مثال:

#include <string>
#include <iostream>
using namespace std;

int main() {
    string greeting = "Hello";
    greeting.append(", World!");  // اضافه کردن رشته
    cout << "Greeting: " << greeting << endl;  // خروجی: Hello, World!
    return 0;
}

find()

تابع find() برای جستجوی یک زیررشته درون یک رشته اصلی استفاده می‌شود. این تابع اولین موقعیت (ایندکس) شروع زیررشته را برمی‌گرداند و اگر زیررشته پیدا نشود، مقدار string::npos را باز می‌گرداند.

مثال:

#include <string>
#include <iostream>
using namespace std;

int main() {
    string sentence = "I love C++ programming!";
    size_t pos = sentence.find("C++");
    if (pos != string::npos) {
        cout << "Found 'C++' at position: " << pos << endl;  // خروجی: 7
    } else {
        cout << "'C++' not found!" << endl;
    }
    return 0;
}

replace()

تابع replace() به شما این امکان را می‌دهد که یک زیررشته را با یک رشته دیگر جایگزین کنید. این تابع سه پارامتر دارد: موقعیت شروع، تعداد کاراکترهایی که باید جایگزین شوند، و رشته جدید.

مثال:

#include <string>
#include <iostream>
using namespace std;

int main() {
    string sentence = "I love C++ programming!";
    sentence.replace(7, 3, "Java");  // جایگزینی "C++" با "Java"
    cout << "Updated sentence: " << sentence << endl;  // خروجی: I love Java programming!
    return 0;
}

erase()

تابع erase() برای حذف یک بخش از رشته استفاده می‌شود. این تابع می‌تواند از موقعیت خاصی شروع کرده و تعداد مشخصی از کاراکترها را حذف کند.

مثال:

#include <string>
#include <iostream>
using namespace std;

int main() {
    string sentence = "I love C++ programming!";
    sentence.erase(7, 4);  // حذف کلمه "C++"
    cout << "Updated sentence: " << sentence << endl;  // خروجی: I love programming!
    return 0;
}

c_str()

تابع c_str() رشته C-style (آرایه‌ای از کاراکترها) را از یک رشته std::string باز می‌گرداند. این تابع زمانی مفید است که بخواهید رشته C++ را به توابع قدیمی C که از رشته‌های C-style استفاده می‌کنند، ارسال کنید.

مثال:

#include <string>
#include <iostream>
using namespace std;

int main() {
    string greeting = "Hello, World!";
    const char* cstr = greeting.c_str();  // تبدیل به رشته C-style
    cout << "C-style string: " << cstr << endl;  // خروجی: Hello, World!
    return 0;
}

نکات اضافی در کار با رشته‌ها

رشته‌های خالی: اگر یک رشته بدون مقدار اولیه ایجاد شود، به طور خودکار یک رشته خالی (“”) ایجاد می‌شود.

string emptyString;
cout << "Empty string length: " << emptyString.length() << endl;  // 0

عملگرهای + و +=: علاوه بر استفاده از append(), شما می‌توانید از عملگر + یا += برای اضافه کردن رشته‌ها به یکدیگر استفاده کنید:

string str1 = "Hello";
string str2 = " World!";
string result = str1 + str2;  // ترکیب دو رشته
cout << result << endl;  // خروجی: Hello World!

کتابخانه <string> در C++ ابزار بسیار قدرتمندی برای کار با رشته‌ها است و انجام عملیات مختلف مانند جستجو، استخراج زیررشته، افزودن، حذف، و مقایسه رشته‌ها را بسیار آسان می‌کند. برخلاف رشته‌ها در زبان C، که به صورت آرایه‌های کاراکتری مدیریت می‌شوند، رشته‌ها در C++ با استفاده از کلاس std::string به‌طور خودکار حافظه را مدیریت می‌کنند و برنامه‌نویسان می‌توانند بدون نگرانی از جزئیات حافظه به راحتی با آن‌ها کار کنند.

کتابخانه <cstring> (C++ <cstring>)

کتابخانه <cstring> در C++ مجموعه‌ای از توابع را برای کار با آرایه‌های کاراکتری (C-style strings) فراهم می‌آورد. این آرایه‌ها در واقع رشته‌هایی هستند که به صورت آرایه‌ای از کاراکترها ذخیره می‌شوند و در زبان C و C++ بسیار رایج هستند. برخلاف رشته‌های std::string که در کتابخانه <string> در C++ موجود هستند و به صورت خودکار حافظه را مدیریت می‌کنند، رشته‌های C-style باید به‌صورت دستی مدیریت شوند و این موضوع باعث می‌شود که کتابخانه <cstring> بسیار مفید باشد.

توابع مهم در کتابخانه <cstring>

کتابخانه <cstring> توابع متعددی برای انجام عملیات مختلف روی آرایه‌های کاراکتری ارائه می‌دهد. در ادامه به معرفی و توضیح برخی از این توابع پرکاربرد می‌پردازیم:

strlen()

تابع strlen() طول یک رشته C-style را برمی‌گرداند. این تابع تعداد کاراکترهای موجود در آرایه کاراکتری را محاسبه می‌کند و مقدار null (یعنی ‘\0’) را که نشان‌دهنده پایان رشته است در نظر نمی‌گیرد.

مثال:

#include <cstring>
#include <iostream>
using namespace std;

int main() {
    char str[] = "Hello, World!";
    cout << "Length of string: " << strlen(str) << endl;  // خروجی: 13
    return 0;
}

strcpy()

تابع strcpy() برای کپی کردن یک رشته به رشته دیگری استفاده می‌شود. این تابع رشته مقصد را با محتوای رشته مبدا پر می‌کند. توجه داشته باشید که در هنگام استفاده از این تابع باید فضای کافی برای رشته مقصد در نظر گرفته شود.

مثال:

#include <cstring>
#include <iostream>
using namespace std;

int main() {
    char src[] = "Hello";
    char dest[20];  // باید فضای کافی برای رشته مقصد رزرو شود
    strcpy(dest, src);  // کپی کردن رشته src به dest
    cout << "Destination string: " << dest << endl;  // خروجی: Hello
    return 0;
}

strcmp()

تابع strcmp() برای مقایسه دو رشته استفاده می‌شود. این تابع دو رشته را با هم مقایسه می‌کند و مقدار صحیحی برمی‌گرداند که نشان‌دهنده نتیجه مقایسه است:

اگر دو رشته برابر باشند، مقدار صفر (0) باز می‌گرداند.
اگر رشته اول از رشته دوم کوچکتر باشد، یک عدد منفی باز می‌گرداند.
اگر رشته اول از رشته دوم بزرگتر باشد، یک عدد مثبت باز می‌گرداند.

مثال:

#include <cstring>
#include <iostream>
using namespace std;

int main() {
    char str1[] = "Hello";
    char str2[] = "World";
    if (strcmp(str1, str2) != 0) {
        cout << "Strings are different" << endl;  // خروجی: Strings are different
    }
    return 0;
}

strcat()

تابع strcat() برای اتصال (concatenate) دو رشته به هم استفاده می‌شود. این تابع رشته دوم را به انتهای رشته اول اضافه می‌کند.

مثال:

#include <cstring>
#include <iostream>
using namespace std;

int main() {
    char str1[20] = "Hello";
    char str2[] = " World!";
    strcat(str1, str2);  // اضافه کردن str2 به انتهای str1
    cout << "Concatenated string: " << str1 << endl;  // خروجی: Hello World!
    return 0;
}

strchr()

تابع strchr() برای جستجو و پیدا کردن اولین وقوع یک کاراکتر در یک رشته استفاده می‌شود. این تابع نشان‌دهنده اولین موقعیت (در قالب اشاره‌گر به کاراکتر) از کاراکتری است که در رشته پیدا شده است.

مثال:

#include <cstring>
#include <iostream>
using namespace std;

int main() {
    char str[] = "Hello, World!";
    char* ptr = strchr(str, 'o');  // جستجو برای اولین 'o'
    if (ptr != nullptr) {
        cout << "Found 'o' at position: " << (ptr - str) << endl;  // موقعیت اولین 'o'
    }
    return 0;
}

strtok()

تابع strtok() برای تقسیم یک رشته به توکن‌ها (مقاطع) بر اساس جداکننده‌ها (delimiters) استفاده می‌شود. این تابع به شما این امکان را می‌دهد که یک رشته را به بخش‌های مختلف تقسیم کنید.

مثال:

#include <cstring>
#include <iostream>
using namespace std;

int main() {
    char str[] = "apple,banana,cherry";
    char* token = strtok(str, ",");  // تقسیم رشته بر اساس جداکننده ','
    while (token != nullptr) {
        cout << token << endl;  // چاپ توکن‌ها
        token = strtok(nullptr, ",");
    }
    return 0;
}

در این مثال، رشته “apple,banana,cherry” با استفاده از strtok() به توکن‌های “apple”, “banana” و “cherry” تقسیم می‌شود و هر کدام در یک خط جداگانه چاپ می‌شود.

نکات اضافی در کار با آرایه‌های کاراکتری

فضای کافی برای رشته‌ها: هنگام استفاده از توابعی مانند strcpy(), strcat() و دیگر توابعی که با آرایه‌های کاراکتری کار می‌کنند، باید همیشه مطمئن شوید که فضای کافی برای ذخیره رشته‌ها و نتایج عملیات در نظر گرفته شده است. اگر فضای کافی در آرایه‌های مقصد در نظر گرفته نشود، ممکن است با خطای overflow مواجه شوید.

تخصیص حافظه داینامیک: هنگام استفاده از آرایه‌های کاراکتری داینامیک (با استفاده از new یا malloc)، باید اطمینان حاصل کنید که حافظه به درستی آزاد می‌شود.

کتابخانه <cstring> ابزارهای مهمی را برای کار با آرایه‌های کاراکتری و انجام عملیات مختلف روی رشته‌های C-style فراهم می‌کند. این توابع برای کپی کردن، مقایسه، تغییر، و تجزیه رشته‌ها بسیار مفید هستند و در برنامه‌نویسی C++ به ویژه زمانی که با کدهای قدیمی C سر و کار داریم، بسیار استفاده می‌شوند.

کتابخانه <ctime> (C++ <ctime>)

کتابخانه <ctime> در C++ برای مدیریت و کار با تاریخ و زمان استفاده می‌شود. این کتابخانه شامل توابعی است که به شما اجازه می‌دهد زمان جاری را دریافت کنید، زمان‌ها را به قالب‌های مختلف تبدیل کنید، و تفاوت بین دو زمان را محاسبه کنید. این ابزارها برای بسیاری از کاربردهای برنامه‌نویسی ضروری است، به‌ویژه در برنامه‌های مرتبط با زمان‌بندی، لاگ‌گذاری، محاسبات تاریخی و موارد مشابه.

توابع مهم در کتابخانه <ctime>

در اینجا چند تابع مهم و پرکاربرد در کتابخانه <ctime> آورده شده است که برای کار با زمان در C++ بسیار مفید هستند.

time()

تابع time() زمان جاری را به‌صورت تعداد ثانیه از تاریخ 1 ژانویه 1970 (به نام “epoch time”) برمی‌گرداند. این تابع معمولاً برای دریافت زمان جاری به‌طور کلی در برنامه‌ها استفاده می‌شود.

مثال:

#include <ctime>
#include <iostream>
using namespace std;

int main() {
    time_t currentTime = time(0);  // دریافت زمان جاری
    cout << "Current time: " << ctime(&currentTime) << endl;  // تبدیل به فرمت خوانا
    return 0;
}

در این مثال، تابع time(0) زمان جاری را به‌صورت یک مقدار time_t (که در واقع تعداد ثانیه‌ها از زمان epoch است) دریافت می‌کند و سپس با استفاده از تابع ctime() آن را به یک رشته در فرمت خوانا تبدیل می‌کند (مانند “Wed Feb 22 14:30:12 2025”).

localtime()

تابع localtime() یک مقدار time_t (زمان به‌صورت تعداد ثانیه از epoch) را دریافت کرده و آن را به یک ساختار tm تبدیل می‌کند که شامل اطلاعات مربوط به تاریخ و زمان به صورت محلی است. این تابع به‌طور خودکار زمان را به زمان محلی (بر اساس تنظیمات سیستم) تبدیل می‌کند.

مثال:

#include <ctime>
#include <iostream>
using namespace std;

int main() {
    time_t currentTime = time(0);  // دریافت زمان جاری
    struct tm* localTime = localtime(&currentTime);  // تبدیل به زمان محلی
    cout << "Local time: " << asctime(localTime) << endl;  // تبدیل به فرمت خوانا
    return 0;
}

در این مثال، localtime() زمان را به فرمت ساختار tm تبدیل می‌کند که می‌توان از آن برای دسترسی به اجزای مختلف زمان (مانند سال، ماه، روز، ساعت و دقیقه) استفاده کرد. سپس از تابع asctime() برای نمایش آن به‌صورت یک رشته خوانا استفاده می‌شود.

difftime()

تابع difftime() تفاوت زمانی بین دو زمان را محاسبه می‌کند و نتیجه را به‌صورت تعداد ثانیه‌ها باز می‌گرداند. این تابع معمولاً برای محاسبه تفاوت بین زمان جاری و یک زمان خاص یا دو زمان مختلف استفاده می‌شود.

مثال:

#include <ctime>
#include <iostream>
using namespace std;

int main() {
    time_t startTime = time(0);  // زمان شروع
    // فرض کنید که زمان 5 ثانیه صبر می‌کنیم
    // برای شبیه‌سازی تاخیر
    for (int i = 0; i < 1000000000; ++i);  // فقط برای شبیه‌سازی زمان
    time_t endTime = time(0);  // زمان پایان

    double diff = difftime(endTime, startTime);  // محاسبه تفاوت
    cout << "Time difference: " << diff << " seconds" << endl;
    return 0;
}

در این مثال، زمان شروع و پایان با استفاده از time(0) ذخیره می‌شود و سپس با استفاده از تابع difftime() تفاوت زمانی بین این دو زمان به‌صورت تعداد ثانیه‌ها محاسبه می‌شود. در اینجا، فرض کرده‌ایم که تاخیر 5 ثانیه‌ای به‌طور دستی شبیه‌سازی شده است.

gmtime()

مشابه با localtime(), تابع gmtime() زمان را به یک ساختار tm تبدیل می‌کند، اما در اینجا زمان به‌صورت جهانی (UTC) به‌جای زمان محلی نمایش داده می‌شود. این تابع برای کار با زمان به‌صورت جهانی مفید است.

مثال:

#include <ctime>
#include <iostream>
using namespace std;

int main() {
    time_t currentTime = time(0);  // دریافت زمان جاری
    struct tm* utcTime = gmtime(&currentTime);  // تبدیل به زمان UTC
    cout << "UTC time: " << asctime(utcTime) << endl;  // نمایش زمان در فرمت خوانا
    return 0;
}

در این مثال، زمان به‌صورت جهانی (UTC) با استفاده از gmtime() تبدیل می‌شود و سپس با استفاده از asctime() نمایش داده می‌شود.

mktime()

تابع mktime() یک ساختار tm را دریافت کرده و آن را به زمان به‌صورت تعداد ثانیه از epoch تبدیل می‌کند. این تابع معمولاً زمانی استفاده می‌شود که شما بخواهید تاریخ و زمان خاصی را به فرمت time_t تبدیل کنید.

مثال:

#include <ctime>
#include <iostream>
using namespace std;

int main() {
    struct tm timeStruct = {0};  // ساختار برای زمان مشخص
    timeStruct.tm_year = 2025 - 1900;  // سال (از 1900 شروع می‌شود)
    timeStruct.tm_mon = 1;  // ماه (0 برای ژانویه, 1 برای فوریه)
    timeStruct.tm_mday = 22;  // روز ماه
    timeStruct.tm_hour = 14;  // ساعت
    timeStruct.tm_min = 30;   // دقیقه
    timeStruct.tm_sec = 0;    // ثانیه

    time_t specificTime = mktime(&timeStruct);  // تبدیل به time_t
    cout << "Specific time: " << ctime(&specificTime) << endl;
    return 0;
}

در این مثال، یک زمان مشخص (22 فوریه 2025 ساعت 14:30) با استفاده از ساختار tm تنظیم می‌شود و سپس با استفاده از تابع mktime() به زمان time_t تبدیل می‌شود. این زمان به فرمت خوانا با استفاده از ctime() نمایش داده می‌شود.

نکات اضافی

زمان سیستم: در بیشتر سیستم‌ها، زمان جاری (که توسط time(0) دریافت می‌شود) به‌صورت تعداد ثانیه از 1 ژانویه 1970 (epoch) در نظر گرفته می‌شود. بنابراین، این زمان وابسته به تنظیمات سیستم است.

زمان محلی و زمان جهانی: تابع localtime() زمان را به زمان محلی (متناسب با تنظیمات منطقه زمانی سیستم) تبدیل می‌کند، در حالی که gmtime() زمان را به‌صورت جهانی (UTC) باز می‌گرداند. این نکته مهم است که هنگام برنامه‌نویسی با تاریخ و زمان، به‌ویژه در برنامه‌های بین‌المللی، منطقه زمانی سیستم خود را در نظر بگیرید.

کتابخانه <ctime> ابزارهای قدرتمندی را برای کار با تاریخ و زمان در C++ فراهم می‌آورد. از آنجا که تاریخ و زمان در بسیاری از برنامه‌ها اهمیت زیادی دارد، این کتابخانه برای محاسبات زمانی، دریافت زمان جاری، تبدیل زمان‌ها به فرمت‌های مختلف، و انجام عملیات‌های مرتبط با زمان بسیار مفید است.

کتابخانه <vector> (C++ <vector>)

کتابخانه <vector> در C++ یکی از پرکاربردترین کتابخانه‌ها برای کار با ساختار داده‌ای وکتور است. وکتور در حقیقت یک نوع آرایه داینامیک است که برخلاف آرایه‌های ثابت، می‌تواند اندازه‌اش به طور خودکار تغییر کند. این ویژگی به برنامه‌نویسان اجازه می‌دهد که داده‌ها را به راحتی اضافه، حذف و دسترسی پیدا کنند بدون اینکه نیاز به مدیریت حافظه به طور دستی داشته باشند. وکتورها در C++ به‌ویژه برای ذخیره‌سازی داده‌های دنباله‌ای (sequential data) بسیار مفید هستند.

مزایای استفاده از وکتور

افزایش خودکار اندازه: برخلاف آرایه‌های ثابت که اندازه آنها باید در زمان کامپایل مشخص شود، وکتورها می‌توانند اندازه خود را به طور خودکار تغییر دهند.
دسترسی سریع: وکتورها مشابه آرایه‌ها هستند و دسترسی به عناصر آنها از طریق ایندکس انجام می‌شود، بنابراین عملیات دسترسی بسیار سریع است.
پشتیبانی از انواع مختلف داده: وکتورها می‌توانند داده‌های مختلفی از انواع مختلف را ذخیره کنند (مانند انواع عددی، رشته‌ها، شی‌ها و غیره).
مدیریت حافظه خودکار: وکتورها حافظه را به‌طور خودکار تخصیص و آزاد می‌کنند، بنابراین نیازی به مدیریت حافظه به صورت دستی نیست.

توابع مهم در کتابخانه <vector>

push_back()

تابع push_back() برای اضافه کردن یک عنصر به انتهای وکتور استفاده می‌شود. این تابع می‌تواند هر نوع داده‌ای را به وکتور اضافه کند. اگر فضای کافی برای اضافه کردن عنصر جدید وجود نداشته باشد، وکتور به طور خودکار فضای بیشتری تخصیص می‌دهد.

مثال:

#include <vector>
#include <iostream>
using namespace std;

int main() {
    vector<int> numbers = {1, 2, 3};
    numbers.push_back(4);  // اضافه کردن ۴ به وکتور
    cout << "Size of vector: " << numbers.size() << endl;  // خروجی: 4
    return 0;
}

size()

تابع size() تعداد عناصر موجود در وکتور را برمی‌گرداند. این تابع مفید است برای پی بردن به اندازه وکتور در زمان اجرا و انجام عملیات‌های مربوط به آن.

مثال:

#include <vector>
#include <iostream>
using namespace std;

int main() {
    vector<int> numbers = {1, 2, 3, 4, 5};
    cout << "Size of vector: " << numbers.size() << endl;  // خروجی: 5
    return 0;
}

at()

تابع at() برای دسترسی به یک عنصر خاص در وکتور استفاده می‌شود. این تابع مشابه با عملگر ایندکس ([]) است، با این تفاوت که در صورت دسترسی به ایندکس نامعتبر (خارج از محدوده وکتور)، یک استثنا (out_of_range) پرتاب می‌کند.

مثال:

#include <vector>
#include <iostream>
using namespace std;

int main() {
    vector<int> numbers = {10, 20, 30, 40, 50};
    cout << "Element at index 2: " << numbers.at(2) << endl;  // خروجی: 30
    // دسترسی به ایندکس نامعتبر
    try {
        cout << numbers.at(10) << endl;  // این کار باعث خطا می‌شود
    } catch (const out_of_range& e) {
        cout << "Error: " << e.what() << endl;  // خروجی: Error: vector::_M_range_check
    }
    return 0;
}

pop_back()

تابع pop_back() برای حذف آخرین عنصر از وکتور استفاده می‌شود. این تابع عنصر آخر وکتور را حذف کرده و اندازه وکتور را به‌روز می‌کند.

مثال:

#include <vector>
#include <iostream>
using namespace std;

int main() {
    vector<int> numbers = {1, 2, 3, 4, 5};
    numbers.pop_back();  // حذف آخرین عنصر (۵)
    cout << "Size of vector after pop_back: " << numbers.size() << endl;  // خروجی: 4
    return 0;
}

clear()

تابع clear() برای حذف تمامی عناصر وکتور و خالی کردن آن استفاده می‌شود. پس از اجرای این تابع، وکتور دیگر هیچ عنصری ندارد.

مثال:

#include <vector>
#include <iostream>
using namespace std;

int main() {
    vector<int> numbers = {1, 2, 3, 4, 5};
    numbers.clear();  // خالی کردن وکتور
    cout << "Size of vector after clear: " << numbers.size() << endl;  // خروجی: 0
    return 0;
}

resize()

تابع resize() برای تغییر اندازه وکتور استفاده می‌شود. این تابع می‌تواند اندازه وکتور را بزرگتر یا کوچکتر کند. اگر اندازه جدید بزرگتر از اندازه فعلی باشد، به تعداد اضافی از عناصر پیش‌فرض (یا مقدار مشخص شده) به وکتور اضافه می‌شود.

مثال:

#include <vector>
#include <iostream>
using namespace std;

int main() {
    vector<int> numbers = {1, 2, 3};
    numbers.resize(5, 10);  // تغییر اندازه به ۵ و اضافه کردن ۱۰ به انتها
    cout << "Vector after resize: ";
    for (int num : numbers) {
        cout << num << " ";  // خروجی: 1 2 3 10 10
    }
    cout << endl;
    return 0;
}

کتابخانه <vector> در C++ ابزار بسیار مفیدی برای کار با آرایه‌های داینامیک است که می‌تواند اندازه‌اش را به‌طور خودکار تغییر دهد. این ویژگی به‌ویژه در مواقعی که نمی‌دانیم تعداد دقیق عناصر مورد نیاز چقدر خواهد بود، بسیار مفید است. توابع مختلفی مانند push_back(), size(), at(), pop_back(), و resize() به شما این امکان را می‌دهند که به راحتی و به صورت امن با وکتورها کار کنید. وکتورها در C++ جزء ساختارهای داده‌ای بسیار پرکاربرد هستند و در اکثر برنامه‌های کاربردی از آنها استفاده می‌شود.

کتابخانه <algorithm> (C++ <algorithm>)

کتابخانه <algorithm> در C++ یکی از کتابخانه‌های پرکاربرد است که مجموعه‌ای از توابع استاندارد برای انجام عملیات‌های مختلف بر روی داده‌ها را فراهم می‌کند. این توابع شامل عملیات‌هایی مانند مرتب‌سازی، جستجو، معکوس کردن، و بسیاری دیگر است که می‌توانند به راحتی بر روی مجموعه‌های مختلف داده‌ها اعمال شوند. این کتابخانه از قابلیت‌های مهم C++ است که به برنامه‌نویسان این امکان را می‌دهد تا با استفاده از توابع از پیش نوشته شده و بهینه، کارایی کدهای خود را بالا ببرند.

کتابخانه <algorithm> به طور گسترده در C++ برای انجام کارهای مختلف بر روی داده‌های مجموعه‌ای (مثل آرایه‌ها، وکتورها، لیست‌ها و غیره) استفاده می‌شود. این کتابخانه با ارائه الگوریتم‌هایی نظیر مرتب‌سازی، جستجو، مقایسه و غیره، کدنویسی را برای برنامه‌نویسان بسیار ساده‌تر و کارآمدتر می‌کند.

توابع مهم در کتابخانه <algorithm>

sort()

تابع sort() برای مرتب‌سازی عناصر یک مجموعه (مانند وکتور، آرایه، یا لیست) استفاده می‌شود. این تابع به‌طور پیش‌فرض مجموعه را به صورت صعودی مرتب می‌کند. همچنین، می‌توان تابع مقایسه‌ای دلخواه را به عنوان ورودی به آن داد تا مرتب‌سازی به صورت دلخواه انجام شود.

مثال:

#include <algorithm>
#include <vector>
#include <iostream>
using namespace std;

int main() {
    vector<int> numbers = {5, 2, 8, 1};
    sort(numbers.begin(), numbers.end());  // مرتب‌سازی به صورت صعودی
    for (int num : numbers) {
        cout << num << " ";  // خروجی: 1 2 5 8
    }
    return 0;
}

find()

تابع find() برای جستجو در یک مجموعه استفاده می‌شود. این تابع به دنبال یک عنصر خاص می‌گردد و در صورت پیدا کردن آن، اشاره‌گر به اولین وقوع عنصر را باز می‌گرداند. اگر عنصر پیدا نشود، تابع find() یک اشاره‌گر به انتهای مجموعه (end()) برمی‌گرداند.

مثال:

#include <algorithm>
#include <vector>
#include <iostream>
using namespace std;

int main() {
    vector<int> numbers = {5, 2, 8, 1};
    auto it = find(numbers.begin(), numbers.end(), 8);  // جستجو برای عنصر ۸
    if (it != numbers.end()) {
        cout << "Element found at index: " << distance(numbers.begin(), it) << endl;
    } else {
        cout << "Element not found" << endl;
    }
    return 0;
}

reverse()

تابع reverse() برای معکوس کردن ترتیب عناصر یک مجموعه استفاده می‌شود. این تابع ترتیب عناصر را از آخر به اول تغییر می‌دهد.

مثال:

#include <algorithm>
#include <vector>
#include <iostream>
using namespace std;

int main() {
    vector<int> numbers = {5, 2, 8, 1};
    reverse(numbers.begin(), numbers.end());  // معکوس کردن وکتور
    for (int num : numbers) {
        cout << num << " ";  // خروجی: 1 8 2 5
    }
    return 0;
}

max_element()

تابع max_element() برای پیدا کردن بزرگترین عنصر در یک مجموعه استفاده می‌شود. این تابع اشاره‌گر به بزرگترین عنصر را باز می‌گرداند.

مثال:

#include <algorithm>
#include <vector>
#include <iostream>
using namespace std;

int main() {
    vector<int> numbers = {5, 2, 8, 1};
    auto maxElement = max_element(numbers.begin(), numbers.end());
    cout << "Maximum element is: " << *maxElement << endl;  // خروجی: 8
    return 0;
}

min_element()

مشابه max_element(), تابع min_element() برای پیدا کردن کوچکترین عنصر در یک مجموعه استفاده می‌شود.

مثال:

#include <algorithm>
#include <vector>
#include <iostream>
using namespace std;

int main() {
    vector<int> numbers = {5, 2, 8, 1};
    auto minElement = min_element(numbers.begin(), numbers.end());
    cout << "Minimum element is: " << *minElement << endl;  // خروجی: 1
    return 0;
}

copy()

تابع copy() برای کپی کردن عناصر از یک مجموعه به مجموعه دیگری استفاده می‌شود. این تابع به شما این امکان را می‌دهد که داده‌ها را از یک محدوده مشخص به محدوده دیگر کپی کنید.

مثال:

#include <algorithm>
#include <vector>
#include <iostream>
using namespace std;

int main() {
    vector<int> numbers = {5, 2, 8, 1};
    vector<int> copiedNumbers(4);
    copy(numbers.begin(), numbers.end(), copiedNumbers.begin());
    
    for (int num : copiedNumbers) {
        cout << num << " ";  // خروجی: 5 2 8 1
    }
    return 0;
}

کتابخانه <algorithm> در C++ ابزار بسیار مفیدی برای انجام عملیات‌های مختلف بر روی مجموعه‌های داده است. این کتابخانه شامل توابعی برای مرتب‌سازی، جستجو، معکوس کردن و بسیاری دیگر از عملیات‌های استاندارد است که می‌توانند به راحتی بر روی انواع داده‌ها اعمال شوند. با استفاده از این توابع، برنامه‌نویسان می‌توانند کدهای خود را ساده‌تر و کارآمدتر بنویسند. از آنجا که این توابع به صورت عمومی و استاندارد در دسترس هستند، استفاده از آن‌ها برای انجام عملیات‌های پایه‌ای بسیار موثر و بهینه است.

نتیجه‌گیری

مرجع و کتابخانه‌ها در C++ یکی از مهم‌ترین بخش‌های این زبان محسوب می‌شوند که به برنامه‌نویسان امکان می‌دهند کدهای بهینه، خوانا و قابل نگهداری بنویسند. با استفاده از کتابخانه‌های استاندارد مانند <iostream> برای ورودی و خروجی، <cmath> برای محاسبات ریاضی، <vector> برای آرایه‌های پویا و <algorithm> برای پردازش داده‌ها، می‌توان توسعه نرم‌افزار را ساده‌تر و کارآمدتر کرد. علاوه بر این، آشنایی با مرجع C++ و استفاده از منابع معتبر به یادگیری سریع‌تر و عمیق‌تر این زبان کمک می‌کند. تسلط بر این ابزارها باعث افزایش بهره‌وری و ایجاد برنامه‌های بهینه‌تر می‌شود.

آموزش مرجع و کتابخانه‌ها در C++

دیدگاه های شما

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *