الحدود وSubspans
قسّم spans بأمان
الحدود وSubspans درس مجاني في C++ Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في C++ Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة C++ Academy 4 دروس في المجموع.
التقسيم باستخدام subspan
تُعيد s.subspan(offset, count) span فوق جزء من الأصل، من دون نسخ؛ فهي تنشئ مؤشرًا وطولًا جديدين فقط.
#include <iostream>
#include <span>
int main() {
int buf[] = {0, 1, 2, 3, 4};
std::span<int> s(buf, 5);
auto mid = s.subspan(1, 3);
for (int x : mid) std::cout << x << " ";
std::cout << "\n"; // 1 2 3
}first وlast
يوفر first(n) وlast(n) Spans فوق أول n عناصر أو آخرها.
#include <iostream>
#include <span>
int main() {
int buf[] = {10, 20, 30, 40};
std::span<int> s(buf, 4);
auto f = s.first(2);
auto l = s.last(2);
std::cout << f[0] << " " << l[1] << "\n"; // 10 40
}تتشارك Subspans الذاكرة
يؤدي تعديل subspan إلى تغيير البيانات الأصلية، لأن كليهما يشير إلى المخزن المؤقت نفسه.
#include <iostream>
#include <span>
int main() {
int buf[] = {1, 1, 1, 1};
std::span<int> s(buf, 4);
auto tail = s.last(2);
tail[0] = 99;
std::cout << buf[2] << "\n"; // 99
}size_bytes
تُعيد size_bytes() الحجم الإجمالي بالبايت لعناصر span، وهذا مفيد لعمليات الإدخال والإخراج منخفضة المستوى.
#include <iostream>
#include <span>
int main() {
int buf[] = {1, 2, 3};
std::span<int> s(buf, 3);
std::cout << s.size_bytes() << "\n"; // 3 * sizeof(int)
}الحدود مسؤوليتك
لا تتحقق operator[] على span من الحدود. وتُعد قراءة s[s.size()] سلوكًا غير معرّف.
تحقق قبل التقسيم
يُعد استدعاء subspan بإزاحة أو عدد أكبر من حجم span سلوكًا غير معرّف؛ لذا تحقّق أولًا باستخدام size().
#include <iostream>
#include <span>
int main() {
int buf[] = {1, 2, 3};
std::span<int> s(buf, 3);
size_t off = 1, cnt = 2;
if (off + cnt <= s.size()) {
auto sub = s.subspan(off, cnt);
std::cout << sub.size() << "\n";
}
}يصبح فارغًا بعد التقسيم
قد ينتج عن التقسيم span فارغ، مثل first(0)؛ فتعامل معه كما تتعامل مع أي نطاق فارغ.
#include <iostream>
#include <span>
int main() {
int buf[] = {1, 2};
std::span<int> s(buf, 2);
auto e = s.first(0);
std::cout << e.empty() << "\n"; // 1
}تسلسل عمليات التقسيم
يمكن تقسيم Subspans بدورها، لأن كل واحدة منها ليست سوى عرض آخر للمخزن المؤقت الأصلي.
#include <iostream>
#include <span>
int main() {
int buf[] = {0, 1, 2, 3, 4, 5};
std::span<int> s(buf, 6);
auto inner = s.subspan(1, 4).first(2);
std::cout << inner[0] << " " << inner[1] << "\n"; // 1 2
}المعالجة على دفعات
من الاستخدامات الشائعة لـ subspan التكرار عبر مخزن مؤقت كبير ضمن نوافذ ثابتة الحجم للبث أو المعالجة على دفعات.
#include <iostream>
#include <span>
int main() {
int buf[] = {1, 2, 3, 4, 5, 6};
std::span<int> s(buf, 6);
for (size_t i = 0; i < s.size(); i += 2) {
auto chunk = s.subspan(i, 2);
std::cout << "[" << chunk[0] << "," << chunk[1] << "] ";
}
std::cout << "\n";
}تحققات الحجم الثابت
باستخدام span ذي حجم ثابت، يستطيع المترجم التحقق من بعض أحجام الشرائح وقت الترجمة، مما يكشف الأخطاء في وقت أبكر.
تظل مدة الصلاحية سارية
تشترك كل Subspans في مدة صلاحية المخزن المؤقت الأصلي. فإذا دُمّر المصدر أو أُعيد تخصيصه، أصبحت جميع Spans المشتقة غير صالحة.
اختبار سريع
تحقق من مدى فهمك لـ Subspans والحدود.
مراجعة
لقد تعلمت الحدود وSubspans:
- تنشئ
subspanوfirstوlastشرائح من دون تخصيص. - تتشارك Subspans الذاكرة، لذلك تؤثر التعديلات في البيانات الأصلية.
- لا تتحقق
operator[]وعمليات التقسيم من الحدود؛ لذا تحقّق أولًا. - تشترك جميع Subspans في مدة صلاحية المصدر.
الأسئلة الشائعة
هل درس «الحدود وSubspans» مجاني؟
نعم — نص درس «الحدود وSubspans» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C++ Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C++ Academy 4 دروس في المجموع.
ماذا ستتعلم في «الحدود وSubspans»؟
قسّم spans بأمان تتمرن على C++ Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ C++ Academy؟
لا تُشترط خبرة سابقة. C++ Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.
كم من الوقت يستغرق درس «الحدود وSubspans»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس C++ Academy هذا؟
نعم. كل درس في C++ Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- std::array ثابتة الحجم
- أساسيات std::span
- تمرير Spans إلى الدوال
- الحدود وSubspans