Std::vector

From binaryoption
Jump to navigation Jump to search
Баннер1

```wiki

مقدمة إلى std::vector في ++C

std::vector هو حاوية ديناميكية في مكتبة القوالب القياسية (STL) للغة ++C. إنه يوفر طريقة فعالة لتخزين مجموعة من العناصر من نفس النوع، مع القدرة على تغيير حجمها ديناميكياً أثناء وقت التشغيل. يعتبر `std::vector` أحد أكثر هياكل البيانات استخداماً في ++C نظراً لمرونته وأدائه الجيد في معظم الحالات. هذا المقال موجه للمبتدئين ويهدف إلى شرح كل جوانب `std::vector` بالتفصيل، بدءاً من الأساسيات وصولاً إلى الاستخدامات المتقدمة. سنناقش أيضاً أوجه التشابه والاختلاف بين `std::vector` وهياكل البيانات الأخرى، بالإضافة إلى اعتبارات الأداء.

الأساسيات: الإعلان والتهيئة

لإعلان `std::vector`، يجب عليك تضمين رأس `<vector>` باستخدام `#include <vector>`. يتم تعريف `std::vector` كقالب، مما يعني أنه يجب عليك تحديد نوع العناصر التي سيحتوي عليها. بناء الجملة الأساسي هو:

`std::vector<DataType> vectorName;`

حيث `DataType` هو نوع البيانات (مثل `int`، `float`، `string`، أو حتى نوع بيانات معرف من قبل المستخدم) و `vectorName` هو اسم المتغير الذي سيمثل المتجه.

أمثلة على الإعلانات:

  • `std::vector<int> numbers;` // متجه من الأعداد الصحيحة.
  • `std::vector<double> prices;` // متجه من الأرقام العشرية.
  • `std::vector<std::string> names;` // متجه من السلاسل النصية.

التهيئة:

هناك عدة طرق لتهيئة `std::vector`:

  • التهيئة الافتراضية: يقوم بإنشاء متجه فارغ بدون أي عناصر.
  • التهيئة بحجم محدد: يقوم بإنشاء متجه بحجم معين، وكل عنصر يتم تهيئته بالقيمة الافتراضية لنوع البيانات (مثل 0 للأعداد الصحيحة، 0.0 للأرقام العشرية، وسلسلة فارغة للسلاسل النصية).
   *   `std::vector<int> numbers(10);` // متجه من 10 أعداد صحيحة، وكلها تساوي 0.
  • التهيئة بقيمة محددة: يقوم بإنشاء متجه بحجم معين، وكل عنصر يتم تهيئته بقيمة محددة.
   *   `std::vector<int> numbers(5, 100);` // متجه من 5 أعداد صحيحة، وكلها تساوي 100.
  • التهيئة من قائمة تهيئة: يقوم بإنشاء متجه باستخدام قائمة من القيم.
   *   `std::vector<int> numbers = {1, 2, 3, 4, 5};`

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

هناك عدة طرق للوصول إلى العناصر الموجودة في `std::vector`:

  • باستخدام عامل الفهرس `[]`: يشبه الوصول إلى عناصر المصفوفة. يبدأ الفهرس من 0. تحذير: لا يقوم عامل الفهرس بإجراء فحص للحدود، مما يعني أنه إذا حاولت الوصول إلى عنصر خارج نطاق المتجه، فقد يؤدي ذلك إلى سلوك غير محدد.
   *   `int firstElement = numbers[0];`
  • باستخدام الدالة `at()`: تشبه عامل الفهرس، ولكنها تقوم بإجراء فحص للحدود. إذا حاولت الوصول إلى عنصر خارج نطاق المتجه، فسترمي استثناء `std::out_of_range`. هذه الطريقة أكثر أماناً من استخدام عامل الفهرس.
   *   `int firstElement = numbers.at(0);`
  • باستخدام الدوال `front()` و `back()`: تسمح بالوصول إلى العنصر الأول والأخير في المتجه على التوالي.
   *   `int firstElement = numbers.front();`
   *   `int lastElement = numbers.back();`
  • باستخدام المؤشرات (Pointers): يمكنك الحصول على مؤشر إلى بداية المتجه باستخدام الدالة `data()`، ثم استخدام العمليات الحسابية على المؤشرات للوصول إلى العناصر. هذه الطريقة أكثر تقدماً وتتطلب فهمًا جيدًا للمؤشرات.

تعديل المتجه

إضافة عناصر:

  • `push_back()`: تضيف عنصرًا جديدًا في نهاية المتجه. هذه هي الطريقة الأكثر شيوعًا لإضافة عناصر إلى المتجه.
   *   `numbers.push_back(6);`
  • `emplace_back()`: تضيف عنصرًا جديدًا في نهاية المتجه مباشرةً، دون الحاجة إلى إنشاء نسخة مؤقتة من العنصر. يمكن أن يكون هذا أكثر كفاءة من `push_back()`، خاصةً بالنسبة للكائنات الكبيرة.
   *   `numbers.emplace_back(7);`
  • `insert()`: تضيف عنصرًا أو مجموعة من العناصر في موضع محدد في المتجه. هذه العملية قد تكون مكلفة، خاصةً إذا تم إدخال العناصر في بداية المتجه، حيث يجب تحريك جميع العناصر اللاحقة.

حذف عناصر:

  • `pop_back()`: تحذف العنصر الأخير في المتجه.
   *   `numbers.pop_back();`
  • `erase()`: تحذف عنصرًا أو مجموعة من العناصر في موضع محدد في المتجه. مثل `insert()`، قد تكون هذه العملية مكلفة.
  • `clear()`: تحذف جميع العناصر من المتجه، مما يجعله فارغًا.

حجم المتجه والسعة

  • `size()`: ترجع عدد العناصر الموجودة حاليًا في المتجه.
  • `capacity()`: ترجع إجمالي عدد العناصر التي يمكن للمتجه تخزينها حاليًا دون إعادة تخصيص الذاكرة. عندما يتم إضافة عناصر جديدة إلى المتجه وتجاوز سعته، يتم تخصيص كتلة ذاكرة جديدة أكبر، ويتم نسخ العناصر القديمة إلى الكتلة الجديدة، ثم يتم تحرير الكتلة القديمة. هذه العملية تسمى إعادة التخصيص (reallocation)، ويمكن أن تكون مكلفة.
  • `resize()`: تغير حجم المتجه إلى حجم جديد. إذا كان الحجم الجديد أكبر من الحجم الحالي، فسيتم إضافة عناصر جديدة إلى نهاية المتجه، وسيتم تهيئتها بالقيمة الافتراضية لنوع البيانات. إذا كان الحجم الجديد أصغر من الحجم الحالي، فسيتم حذف العناصر الزائدة من نهاية المتجه.
  • `reserve()`: تخصص مساحة تخزين إضافية للمتجه، دون تغيير حجمه. يمكن استخدام هذه الدالة لتحسين الأداء إذا كنت تعرف مسبقًا عدد العناصر التي ستخزنها في المتجه.

التكرار (Iteration) على المتجه

هناك عدة طرق للتكرار على عناصر `std::vector`:

  • باستخدام حلقة `for` التقليدية:
   ```cpp
   for (size_t i = 0; i < numbers.size(); ++i) {
       std::cout << numbers[i] << std::endl;
   }
   ```
  • باستخدام حلقة `for` المستندة إلى النطاق (Range-based for loop): هذه الطريقة أبسط وأكثر قابلية للقراءة.
   ```cpp
   for (int number : numbers) {
       std::cout << number << std::endl;
   }
   ```
  • باستخدام المؤشرات (Iterators): تعتبر المؤشرات أكثر مرونة، حيث تسمح بالوصول إلى عناصر المتجه بطرق مختلفة.
   ```cpp
   for (std::vector<int>::iterator it = numbers.begin(); it != numbers.end(); ++it) {
       std::cout << *it << std::endl;
   }
   ```

مقارنة std::vector مع هياكل البيانات الأخرى

| هيكل البيانات | المزايا | العيوب | |---|---|---| | `std::vector` | ديناميكي، وصول عشوائي سريع، أداء جيد في معظم الحالات. | إعادة تخصيص الذاكرة قد تكون مكلفة، إدراج وحذف العناصر في المنتصف قد يكون مكلفًا. | | `std::array` | حجم ثابت، أداء أفضل من `std::vector` في بعض الحالات. | حجم ثابت، لا يمكن تغيير الحجم ديناميكيًا. | | `std::list` | إدراج وحذف العناصر في أي موضع سريع، لا حاجة لإعادة تخصيص الذاكرة. | وصول عشوائي بطيء، استخدام أكبر للذاكرة. | | `std::deque` | إضافة وحذف العناصر في البداية والنهاية سريع، ديناميكي. | وصول عشوائي أبطأ من `std::vector`. |

اعتبارات الأداء

  • **إعادة التخصيص (Reallocation):** تجنب إعادة تخصيص الذاكرة المتكررة عن طريق تخصيص مساحة تخزين كافية مسبقًا باستخدام `reserve()`.
  • **إدراج وحذف العناصر في المنتصف:** تجنب إدراج وحذف العناصر في المنتصف قدر الإمكان، حيث يمكن أن يكون ذلك مكلفًا. إذا كنت بحاجة إلى إجراء عمليات إدراج وحذف متكررة في المنتصف، فقد يكون `std::list` خيارًا أفضل.
  • **استخدام `emplace_back()` بدلاً من `push_back()`:** بالنسبة للكائنات الكبيرة، يمكن أن يكون `emplace_back()` أكثر كفاءة من `push_back()`، حيث يتجنب إنشاء نسخة مؤقتة من العنصر.
  • **الوصول العشوائي:** `std::vector` يوفر وصولاً عشوائياً سريعاً، لذا استخدم `[]` أو `at()` للوصول إلى العناصر مباشرةً.

أمثلة عملية

مثال 1: تخزين أسعار الأسهم:

```cpp

  1. include <iostream>
  2. include <vector>

int main() {

   std::vector<double> stockPrices;
   stockPrices.push_back(150.25);
   stockPrices.push_back(155.75);
   stockPrices.push_back(152.50);
   for (double price : stockPrices) {
       std::cout << "Stock Price: " << price << std::endl;
   }
   return 0;

} ```

مثال 2: تحليل حجم التداول:

```cpp

  1. include <iostream>
  2. include <vector>

int main() {

   std::vector<int> tradeVolumes = {100, 150, 200, 120, 180};
   int totalVolume = 0;
   for (int volume : tradeVolumes) {
       totalVolume += volume;
   }
   std::cout << "Total Trade Volume: " << totalVolume << std::endl;
   return 0;

} ```

علاقة std::vector بالخيارات الثنائية والتداول

على الرغم من أن `std::vector` هو هيكل بيانات برمجي، إلا أنه يمكن استخدامه في سياقات متعلقة بالخيارات الثنائية والتداول، مثل:

الخلاصة

`std::vector` هو هيكل بيانات قوي ومرن يمكن استخدامه في مجموعة واسعة من التطبيقات. فهم أساسياته وكيفية استخدامه بفعالية أمر ضروري لأي مبرمج ++C. من خلال مراعاة اعتبارات الأداء واستخدام الأدوات والتقنيات المناسبة، يمكنك الاستفادة الكاملة من `std::vector` لتحسين كفاءة وموثوقية التعليمات البرمجية الخاصة بك. كما رأينا، يمكن أن يكون له تطبيقات مفيدة في مجال التداول والخيارات الثنائية، مما يساعد في تحليل البيانات، وتنفيذ الاستراتيجيات، وتقييم الأداء. ```

ابدأ التداول الآن

سجّل في IQ Option (الحد الأدنى للإيداع 10 دولار) افتح حساباً في Pocket Option (الحد الأدنى للإيداع 5 دولار)

انضم إلى مجتمعنا

اشترك في قناة Telegram الخاصة بنا @strategybin لتصلك: ✓ إشارات تداول يومية ✓ تحليلات استراتيجية حصرية ✓ تنبيهات اتجاهات السوق ✓ مواد تعليمية للمبتدئين

Баннер