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 الكامل بالعربي.