المصفوفات الديناميكية: 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;
}
اختبر فهمك