Kodax

المصفوفات الديناميكية: std::vector — أساسيات C++

المصفوفات الديناميكية: std::vector

المصفوفة العادية حجمها ثابت ولا تعرف طولها. std::vector (#include <vector>) مصفوفة تكبر وتصغر تلقائياً وتعرف حجمها، وهي الخيار الافتراضي لتخزين مجموعة عناصر في C++ الحديثة.

#include <vector>
vector<int> scores = {90, 75, 88};
vector<string> names;              // فارغة
vector<int> zeros(10, 0);          // 10 عناصر قيمتها 0

ما بين < > هو نوع العناصر.

العمليات الأساسية

| العملية | الكتابة |

|---|---|

| إضافة للنهاية | v.push_back(x) |

| حذف الأخير | v.pop_back() |

| الحجم | v.size() |

| هل فارغة | v.empty() |

| الوصول | v[i] (بدون فحص) أو v.at(i) (مع فحص) |

| أول/آخر عنصر | v.front() / v.back() |

| مسح الكل | v.clear() |

المرور على العناصر

vector<int> scores = {70, 85, 90};
for (int s : scores) cout << s << ' ';                // قراءة
for (int& s : scores) s += 5;                         // تعديل
for (size_t i = 0; i < scores.size(); i++) {          // بالفهرس
    cout << i << ": " << scores[i] << '\n';
}

size() ترجع نوعاً بدون إشارة (size_t)، لذلك استخدمه للعداد لتجنب تحذيرات المقارنة.

الحذف من المنتصف

scores.erase(scores.begin() + 1);   // حذف العنصر الثاني

begin() "مكرّر" يشير لأول عنصر؛ ستتعلم المكرّرات بالتفصيل في دورة C++ المتقدمة.

خوارزميات جاهزة (<algorithm>)

sort(scores.begin(), scores.end());                       // تصاعدي
sort(scores.begin(), scores.end(), greater<int>());       // تنازلي
auto it = max_element(scores.begin(), scores.end());       // أكبر عنصر
int total = accumulate(scores.begin(), scores.end(), 0);   // المجموع (<numeric>)

vector داخل vector

vector<vector<int>> grid(3, vector<int>(4, 0)); جدول 3×4.

التمرير للدوال

تذكّر من درس المراجع: const vector<int>& للقراءة، و vector<int>& للتعديل. التمرير بالقيمة ينسخ كل العناصر.

⚠️ v[i] خارج الحدود

مثل المصفوفات العادية: سلوك غير معرّف. استخدم at() عندما يكون الفهرس قادماً من المستخدم، أو افحص i < v.size().

تمرين

اقرأ درجات حتى إدخال -1 في vector، ثم اطبعها مرتبة تنازلياً، واحذف الدرجات الأقل من 50، واطبع العدد المتبقي والمتوسط.

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

void printAll(const vector<int>& v) {
    for (int x : v) cout << x << " ";
    cout << "(size " << v.size() << ")" << endl;
}

int main() {
    vector<int> scores = {72, 95, 40, 88};
    scores.push_back(61);
    scores.push_back(33);
    printAll(scores);

    cout << "first: " << scores.front() << ", last: " << scores.back() << endl;

    // ترتيب تنازلي
    sort(scores.begin(), scores.end(), greater<int>());
    printAll(scores);

    // أكبر عنصر والمجموع
    int best = *max_element(scores.begin(), scores.end());
    int total = accumulate(scores.begin(), scores.end(), 0);
    cout << "best: " << best << ", average: " << static_cast<double>(total) / scores.size() << endl;

    // حذف الدرجات الأقل من 50
    scores.erase(remove_if(scores.begin(), scores.end(), [](int s) { return s < 50; }), scores.end());
    printAll(scores);

    // التعديل بالمرجع
    for (int& s : scores) s = min(100, s + 5);
    printAll(scores);

    // at() تفحص الحدود
    try {
        cout << scores.at(100) << endl;
    } catch (const out_of_range&) {
        cout << "index out of range" << endl;
    }

    vector<string> names;
    names.push_back("Mona");
    names.push_back("Ali");
    cout << names.size() << " names, empty? " << boolalpha << names.empty() << endl;
    return 0;
}
اختبر فهمك