تخطَّ إلى المحتوى

std::string_view

نص للقراءة بلا نسخ std::string_view

std::string_view من C++17 مجرّد مؤشّر وطول يشير لبيانات نصّية موجودة مسبقًا — بلا نسخ إطلاقًا، ويقبل أي مصدر نصّي (std::string أو C-string) تلقائيًا كمعامل دالة.

تمرير const std::string& كمعامل شائع، لكنه يجبر أحيانًا على إنشاء std::string مؤقتة كاملة لمجرّد تمرير C-string حرفي. string_view يحل هذا: لا يملك البيانات، فقط يشير إليها (مؤشّر + طول)، فلا يوجد أي نسخ أو تخصيص ذاكرة. الثمن: لا يتحكّم بعمر البيانات المُشار إليها إطلاقًا — لو المصدر تحرّر أو تغيّر، string_view يصبح إشارة متدلّية (dangling) فورًا.

الصياغة

void func(std::string_view text);
std::string_view sv = text.substr(0, pos); // substr هنا بلا نسخ أيضًا

📄 مثال

#include <string_view>

void printFirstWord(std::string_view text) { // بلا نسخ مهما كان مصدر النص
    auto spacePos = text.find(' ');
    std::cout << text.substr(0, spacePos);
}

printFirstWord("مرحبا بالعالم");             // C-string حرفي
printFirstWord(std::string("سلام يا صديقي")); // std::string — بلا نسخ

أهم النقاط

العنصرالوظيفة
غير مالك للبياناتمجرّد مؤشّر وطول — لا نسخ ولا تخصيص ذاكرة إطلاقًا
substr/find وغيرهانفس واجهة std::string تقريبًا للقراءة فقط، بلا دوال تعديل
قد لا ينتهي بـ \0على عكس C-string — لا تفترض إمكانية تمريره مباشرة لدوال C القديمة

💡 نصائح عملية

  • استخدمه كمعامل دالة (قراءة فقط، عمر قصير أثناء التنفيذ) — الحالة المثالية له
  • تجنّبه كنوع إرجاع أو كعضو مخزَّن بصنف يعيش أطول من مصدر النص الأصلي

⚠️ أخطاء شائعة

  • إرجاع string_view يشير لمتغيّر محلّي أو كائن std::string مؤقت من دالة — إشارة متدلّية فورية عند خروج الدالة
  • افتراض أنه منتهٍ بـ \0 وتمريره مباشرة لدالة C تتوقّع const char*

خصائص ذات صلة

🎓 تريد فهم الصورة الكاملة خطوة بخطوة؟ ابدأ من مسار CPP الكامل بالعربي.