0Pricing
C++ Academy · درس

تمرير Spans إلى الدوال

اكتب واجهات برمجية مرنة

تمرير Spans إلى الدوال درس مجاني في C++ Academy على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في C++ Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة C++ Academy 4 دروس في المجموع.

دالة واحدة وحاويات متعددة

تقبل الدالة التي تتلقى std::span المصفوفات والمتجهات والمخازن المؤقتة الخام على حد سواء، من دون الحاجة إلى قوالب أو تحميل زائد للدوال.

#include <iostream>
#include <span>
#include <vector>
#include <array>
int sum(std::span<const int> s) {
    int t = 0; for (int x : s) t += x; return t;
}
int main() {
    std::vector<int> v = {1, 2, 3};
    std::array<int, 2> a = {4, 5};
    std::cout << sum(v) << " " << sum(a) << "\n";
}

لا حاجة إلى معامل للحجم

تمرر واجهات C القديمة مؤشرًا وحجمًا منفصلًا. أما span فيجمعهما معًا، مما يلغي أخطاء عدم تطابق الطول.

#include <iostream>
#include <span>
void printAll(std::span<const int> s) {
    for (int x : s) std::cout << x << " ";
    std::cout << "\n";
}
int main() {
    int buf[] = {7, 8, 9};
    printAll(buf); // size inferred
}

const span للقراءة فقط

استخدم std::span<const T> للتعهد بأن الدالة لن تعدّل بيانات المستدعي.

#include <iostream>
#include <span>
int maxOf(std::span<const int> s) {
    int m = s[0];
    for (int x : s) if (x > m) m = x;
    return m;
}
int main() {
    int data[] = {3, 9, 4};
    std::cout << maxOf(data) << "\n"; // 9
}

Mutable span للتعديل في المكان نفسه

يسمح span غير الثابت للدالة بتعديل عناصر المستدعي مباشرةً.

#include <iostream>
#include <span>
#include <vector>
void doubleAll(std::span<int> s) {
    for (int& x : s) x *= 2;
}
int main() {
    std::vector<int> v = {1, 2, 3};
    doubleAll(v);
    std::cout << v[2] << "\n"; // 6
}

يتجنب تضخم القوالب

من دون span، قد تستخدم قالبًا يعتمد على نوع الحاوية، مما ينشئ نسخًا عديدة من الدالة. أما span فيوفر توقيعًا واحدًا ملموسًا يعمل مباشرةً.

يتجنب النسخ

لا يؤدي تمرير span إلى نسخ العناصر مطلقًا؛ إذ لا ينتقل إلى الدالة سوى مؤشر وطول.

#include <iostream>
#include <span>
#include <vector>
size_t count(std::span<const int> s) { return s.size(); }
int main() {
    std::vector<int> big(1000, 0);
    std::cout << count(big) << "\n"; // no copy of 1000 ints
}

Spans الفارغة مقبولة

ينبغي أن تتعامل الدالة مع span فارغ بسلاسة؛ إذ تكون قيمة size() صفرًا، وتعمل حلقة for المعتمدة على النطاق صفر مرة.

#include <iostream>
#include <span>
int sum(std::span<const int> s) { int t = 0; for (int x : s) t += x; return t; }
int main() {
    std::span<const int> empty;
    std::cout << sum(empty) << "\n"; // 0
}

التمرير بالقيمة

أحجام Spans صغيرة، لذا مررها بالقيمة لا بالمرجع. فنسخ مؤشر وطول يكاد يكون مجانيًا.

وثّق نية const

يوضح اختيار span<const T> أو span<T> للمستدعين فورًا ما إذا كان من الممكن تعديل بياناتهم.

يحتفظ المستدعي بالملكية

يظل المستدعي مالكًا للحاوية؛ ولا يستعيرها span إلا طوال مدة الاستدعاء. ويجب ألا تخزن الدالة span بعد انتهاء الاستدعاء.

أسلوب حديث لواجهة برمجية

يُعد قبول span الأسلوب الحديث الاصطلاحي لكتابة دوال تتعامل مع البيانات المتجاورة؛ فهو مرن وآمن ولا يتطلب نسخًا.

اختبار سريع

تحقق من مدى فهمك لتمرير Spans.

مراجعة

لقد تعلمت تمرير Spans إلى الدوال:

  • يقبل توقيع واحد المصفوفات والمتجهات والمخازن المؤقتة.
  • استخدم span<const T> للقراءة فقط، وspan<T> للتعديل في المكان نفسه.
  • مرر بالقيمة، من دون نسخ أي عنصر.
  • يحتفظ المستدعي بالملكية؛ فلا تخزن span بعد انتهاء الاستدعاء.

الأسئلة الشائعة

هل درس «تمرير Spans إلى الدوال» مجاني؟

نعم — نص درس «تمرير Spans إلى الدوال» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C++ Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C++ Academy 4 دروس في المجموع.

ماذا ستتعلم في «تمرير Spans إلى الدوال»؟

اكتب واجهات برمجية مرنة تتمرن على C++ Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ C++ Academy؟

لا تُشترط خبرة سابقة. C++ Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.

كم من الوقت يستغرق درس «تمرير Spans إلى الدوال»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس C++ Academy هذا؟

نعم. كل درس في C++ Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. std::array ثابتة الحجم
  2. أساسيات std::span
  3. تمرير Spans إلى الدوال
  4. الحدود وSubspans
← العودة إلى C++ Academy