عرض السلسلة في C++

Rd Alslslt Fy C



في مجال برمجة C++، يعد إعطاء الأولوية للكفاءة والأداء أمرًا بالغ الأهمية. تقدم فئة 'std::string_view'، التي تم تقديمها في C++ 17، بديلاً متعدد الاستخدامات وفعالاً في الذاكرة لمعالجة السلاسل التقليدية. في جوهره، يعد 'std::string_view' مرجعًا غير مالك لسلسلة من الأحرف، ويمثل عادةً سلسلة فرعية من سلسلة أكبر. على عكس 'std::string' التي تمتلك بياناتها وتدير الذاكرة داخليًا، تعمل 'std::string_view' دون امتلاك البيانات الأساسية. هذه الخاصية تجعلها ذات قيمة خاصة بالنسبة للسيناريوهات التي يكون فيها الحمل الزائد لنسخ الذاكرة أو إدارتها غير مرغوب فيه. في هذه المقالة، سوف نستكشف الأمثلة المختلفة لفهم استخدام 'std::string_view' في C++.

مثال 1: التعامل الفعال مع السلسلة

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







خذ بعين الاعتبار مقتطف التعليمات البرمجية التالي:



#تشمل
#تتضمن

عملية باطلة StringView ( std::string_view strView ) {

الأمراض المنقولة جنسيا::كوت << 'طول: ' << strView.length ( ) << ستد::endl;
الأمراض المنقولة جنسيا::كوت << 'محتوى: ' << strView << ستد::endl;
}

انت مين ( ) {

std::string originalString = 'التعامل الفعال مع السلسلة' ;

std::string_view viewOfString ( originalString ) ;

this.processStringView ( viewOfString ) ;

يعود 0 ;
}


في هذا المثال، لدينا الدالة 'processStringView' التي تأخذ 'std::string_view' كمعلمة لها. تقوم الوظيفة بعد ذلك بطباعة طول عرض السلسلة ومحتواه باستخدام الإخراج القياسي. تقوم الوظيفة الرئيسية بتهيئة 'std::string' المسمى 'originalString' بقيمة 'المعالجة الفعالة للسلسلة'. بعد ذلك، يتم إنشاء 'std::string_view' المسمى 'viewOfString'، في إشارة إلى محتوى 'originalString'.



من خلال تمرير 'viewOfString' إلى وظيفة 'processStringView'، يمكننا إجراء العمليات على السلسلة بكفاءة، مما يلغي الحاجة إلى تخصيص ذاكرة إضافية. يعد 'std::string_view' مرجعًا خفيفًا لتسلسل الأحرف الأساسي لـ 'originalString' دون نسخ البيانات.





هنا هو الإخراج الذي تم إنشاؤه:



المثال 2: إمكانية التشغيل التفاعلي مع التعليمات البرمجية القديمة

في مجال تطوير C++، غالبًا ما يكون التكامل السلس بين قواعد التعليمات البرمجية الجديدة والقديمة مصدر قلق بالغ. يسمح 'std::string_view' للمطورين بالتفاعل بسهولة مع الوظائف القديمة التي تُرجع مؤشرات 'const char'.

خذ بعين الاعتبار المثال التالي الذي يوضح الاستخدام العملي لـ 'std::string_view' لقابلية التشغيل البيني. لدينا هنا دالة قديمة تسمى 'legacyFunction()' والتي تُرجع مؤشر 'const char':

#تشمل
#تتضمن

حرف ثابت * com.legacyFunction ( ) {
يعود 'سلسلة تراثية' ;
}

انت مين ( ) {

std::string_view LegacyStrView ( com.legacyFunction ( ) ) ;

الأمراض المنقولة جنسيا::كوت << 'عرض السلسلة القديمة:' << ليجاسيسترفيو << ستد::endl;

يعود 0 ;
}


نبدأ بتعريف دالة قديمة تسمى 'legacyFunction()' والتي ترجع مؤشر 'const char' الذي يمثل سلسلة تسمى 'Legacy String'. لدمج هذه البيانات القديمة بسلاسة في برنامجنا الحديث C++، نستخدم 'std::string_view'. في الدالة main()، على وجه التحديد، نقوم بإنشاء مثيل لـ 'std::string_view' المسمى 'legacyStrView' وتهيئته بنتيجة الوظيفة القديمة. يسمح لنا هذا الإنشاء بتغليف مؤشر 'const char' القديم بكفاءة والعمل معه.

ونتيجة لذلك، يمكننا الوصول إلى السلسلة القديمة ومعالجتها دون اللجوء إلى نسخ البيانات غير الضرورية، مما يحافظ على الكفاءة والتوافق. تتضمن الخطوة الأخيرة في الكود استخدام 'std::cout' لطباعة محتوى عرض السلسلة القديم.

الإخراج المنفذ هو:

المثال 3: تحسين التعامل مع القيم الحرفية للسلسلة

يتم تمثيل القيم الحرفية للسلسلة في لغة C++ تقليديًا على شكل صفائف من الأحرف. يعمل 'std::string_view' على تبسيط العمل مع السلسلة الحرفية من خلال توفير واجهة ملائمة. من خلال السماح بالوصول المباشر إلى مصفوفة الأحرف الأساسية دون الحاجة إلى تحويلات صريحة، يعمل 'std::string_view' على تبسيط العمليات على السلسلة الحرفية.

#تشمل
#تتضمن

انت مين ( ) {
حرف ثابت * ماي ليترال = 'مرحبًا، عرض السلسلة!' ;
std::string_view literalView ( myLiteral ) ;

الأمراض المنقولة جنسيا::كوت << 'الشخصية الأولى:' << com.literalView [ 0 ] << ستد::endl;

size_t موقف = literalView.find ( 'خيط' ) ;
الأمراض المنقولة جنسيا::كوت << 'موضع السلسلة الفرعية:' << موضع << ستد::endl;

يعود 0 ;
}


في هذا المثال، تظهر عبارة 'Hello, String View!' يتم تعيين السلسلة الحرفية إلى مؤشر 'myLiteral'. يُسهل إدخال 'std::string_view' تمثيلًا أكثر كفاءة لهذه السلسلة دون الحاجة إلى نسخ محتوياتها. يتم إنشاء كائن 'literalView' باستخدام مؤشر 'myLiteral' الذي يسمح لنا بعرض ومعالجة تسلسل الأحرف الأساسي.

يوفر استخدام 'std::string_view' وصولاً سهلاً إلى الأحرف الفردية داخل السلسلة. في مقتطف التعليمات البرمجية، يقوم 'literalView[0]' باسترداد وطباعة الحرف الأول من السلسلة، مما يعرض بساطة ومباشرة الوصول إلى العناصر. يتم استخدام طريقة 'البحث' الخاصة بـ 'std::string_view' لتحديد موضع السلسلة الفرعية 'String' داخل السلسلة الأصلية.

المثال 4: استخراج السلسلة الفرعية

تتضمن مهمة استخراج السلسلة الفرعية استرداد جزء من سلسلة معينة بناءً على معايير محددة مثل موضع المحدد. تعد القدرة على استخراج السلاسل الفرعية بسهولة ميزة قوية لـ 'std::string_view'. فكر في سيناريو نحتاج فيه إلى استخراج جزء من سلسلة بناءً على محدد:

#تشمل
#تتضمن

انت مين ( ) {
الأمراض المنقولة جنسيا::سلسلة سلسلة كاملة = 'التفاح-البرتقال-الموز' ;
size_t delimiterPos = fullString.find ( '-' ) ;

std::string_view subString = fullString.substr ( 0 ، محدد نقاط البيع ) ;

الأمراض المنقولة جنسيا::كوت << 'السلسلة الفرعية المستخرجة:' << سلسلة فرعية << ستد::endl;

يعود 0 ;
}


في مقتطف الكود هذا، نبدأ بإعلان السلسلة الأصلية، 'fullString'، والتي تتم تهيئتها بقيمة 'apple-orange-banana'. هدفنا هو إجراء استخراج السلسلة الفرعية. ولتحقيق ذلك، نستخدم وظيفة 'البحث' التي توفرها مكتبة C++ القياسية.

بمجرد تحديد موضع المحدد داخل 'السلسلة الكاملة'، المخزنة في المتغير 'delimiterPos'، نقوم باستخراج السلسلة الفرعية المطلوبة. يتم استدعاء الدالة 'substr' على السلسلة الأصلية، مع تحديد موضع البداية (0) وطول السلسلة الفرعية الذي هو بالضبط موضع المحدد. تؤدي هذه العملية إلى إنشاء 'std::string_view' المسمى 'subString' الذي يمثل جزء السلسلة الأصلية من البداية حتى المحدد.

المثال 5: هياكل البيانات ذات الكفاءة في الذاكرة

يلعب 'std::string_view' دورًا حاسمًا في تصميم هياكل البيانات ذات الكفاءة في الذاكرة. بدلاً من تخزين نسخ متعددة من السلاسل، يمكن لهياكل البيانات تخزين مثيلات 'std::string_view'، وبالتالي تقليل الحمل الزائد للذاكرة.

#تشمل
#تتضمن

سجل الهيكل {
std::string_view name;
العمر الصحيح؛
} ;

انت مين ( ) {

سجل الشخص = { 'فلان الفلاني' , 30 } ;

الأمراض المنقولة جنسيا::كوت << 'اسم: ' << اسم الشخص << '، عمر: ' << شخصية << ستد::endl;

يعود 0 ;
}


في مقتطف الكود هذا، نعرض استخدام 'std::string_view' ضمن بنية بيانات فعالة في الذاكرة. نحدد بنية 'السجل' التي تشتمل على عضو 'std::string_view' يسمى 'name' وعضو صحيح يسمى 'age'. يتيح لنا استخدام 'std::string_view' في هذا السياق إنشاء تمثيل خفيف لسلسلة دون الحاجة إلى تخصيص ذاكرة إضافية.

في الوظيفة 'الرئيسية'، نقوم بإنشاء كائن 'سجل' يسمى 'شخص' بالاسم 'John Doe' وعمره 30 عامًا. يعمل 'اسم' العضو 'std::string_view' بمثابة عرض غير مالك لـ بيانات الحرف المطابقة للاسم، مما يلغي ضرورة تكرار محتوى السلسلة. 'std::cout << 'الاسم: ' << اسم الشخص << '، العمر: ' << person.age << std::endl؛' يقوم البيان بإخراج اسم وعمر الشخص الذي تم تخزينه في كائن 'السجل'.

خاتمة

في المشهد المتطور باستمرار لتطوير C++، تبرز 'std::string_view' كإضافة قيمة لمجموعة أدوات المبرمج. تسلط الأمثلة الموضحة في هذه المقالة الضوء على قابلية التكيف والفائدة لـ 'std::string_view' في مجال برمجة C++. بدءًا من المعالجة الفعالة للسلاسل وإمكانية التشغيل التفاعلي السلس مع التعليمات البرمجية القديمة وحتى هياكل البيانات ذات الكفاءة في الذاكرة، يعد 'std::string_view' ذا قيمة للمطورين الذين يبحثون عن أداء محسن وتعليمات برمجية محسنة في سيناريوهات متنوعة. توضح هذه السيناريوهات الواقعية كيف يمكن لـ 'std::string_view' تحسين التعليمات البرمجية، وتقليل حمل الذاكرة غير الضروري، والمساهمة في الكفاءة الإجمالية لتطبيقات C++.