ما الفرق بين istringstream و ostringstream و stringstream؟/ لماذا لا تستخدم سلسلة السلاسل في كل حالة؟

StackOverflow https://stackoverflow.com/questions/3292107

سؤال

متى سأستخدم std::istringstream, std::ostringstream و std::stringstream ولماذا لا أستخدمه فقط std::stringstream في كل سيناريو (هل هناك أي مشكلات في الأداء في وقت التشغيل؟).

أخيرًا، هل هناك أي شيء سيء في هذا (بدلاً من استخدام الدفق على الإطلاق):

std::string stHehe("Hello ");

stHehe += "stackoverflow.com";
stHehe += "!";
هل كانت مفيدة؟

المحلول

أنا شخصياً أجد أنه من النادر جدًا أن أرغب في إجراء البث من وإلى نفس دفق السلسلة.

عادةً ما أرغب في تهيئة دفق من سلسلة ثم تحليله؛أو دفق الأشياء إلى دفق سلسلة ثم استخراج النتيجة وتخزينها.

إذا كنت تقوم بالبث من وإلى نفس الدفق، فيجب أن تكون حذرًا للغاية فيما يتعلق بحالة الدفق ومواضع الدفق.

باستخدام "فقط" istringstream أو ostringstream يعبر بشكل أفضل عن نيتك ويمنحك بعض التحقق من الأخطاء السخيفة مثل الاستخدام غير المقصود لـ << ضد >>.

هناك قد يكون هناك بعض التحسن في الأداء ولكني لن أنظر إلى ذلك أولاً.

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

std::string stHehe( "Hello stackoverflow.com!" );

نصائح أخرى

أ stringstream أكبر إلى حد ما، وقد يكون أداءه أقل قليلاً - يمكن أن يتطلب الوراثة المتعددة إجراء تعديل على مؤشر vtable.والفرق الرئيسي هو (على الأقل من الناحية النظرية) التعبير بشكل أفضل عن نيتك، ومنعك من الاستخدام عن طريق الخطأ >> حيث قصدت << (أو العكس).OTOH، الفرق صغير بما فيه الكفاية خاصة بالنسبة للأجزاء السريعة من التعليمات البرمجية التوضيحية وما شابه، أنا كسول وأستخدم فقط stringstream.لا أستطيع أن أتذكر تمامًا آخر مرة استخدمتها عن طريق الخطأ << عندما قصدت >>, ، بالنسبة لي يبدو هذا القدر من الأمان نظريًا في الغالب (خاصة إذا كنت يفعل ارتكاب مثل هذا الخطأ، وسوف يكون دائما تقريبا حقًا واضح على الفور تقريبًا).

لا حرج على الإطلاق في مجرد استخدام سلسلة، طالما أنها تحقق ما تريد.إذا كنت تقوم فقط بتجميع الخيوط معًا، فسيكون الأمر سهلاً ويعمل بشكل جيد.إذا كنت تريد تنسيق أنواع أخرى من البيانات، أ stringstream سوف تدعم ذلك، والسلسلة لن تدعم ذلك في الغالب.

في معظم الحالات، لن تجد نفسك بحاجة إلى كل من الإدخال والإخراج على نفس مجرى السلسلة، لذلك استخدم std::ostringstream و std::istringstream يوضح بوضوح نيتك.كما يمنعك من كتابة عامل التشغيل الخاطئ عن طريق الخطأ (<< ضد >>).

عندما تحتاج إلى إجراء كلتا العمليتين على نفس الدفق، فمن الواضح أنك ستستخدم إصدار الأغراض العامة.

ستكون مشكلات الأداء أقل اهتماماتك هنا، والوضوح هو الميزة الرئيسية.

أخيرًا، لا حرج في استخدام إلحاق السلسلة حيث يتعين عليك إنشاء سلاسل خالصة.لا يمكنك استخدام ذلك لدمج الأرقام كما تفعل في لغات مثل Perl.

istringstream للإدخال، وostringstream للإخراج.stringstream هو الإدخال والإخراج.يمكنك استخدام stringstream تقريبًا في كل مكان.ومع ذلك، إذا أعطيت الكائن الخاص بك لمستخدم آخر، ويستخدم عامل التشغيل >> بينما تنتظر كائنًا للكتابة فقط، فلن تكون سعيدًا ؛-)

ملاحظة:لا يوجد شيء سيء في ذلك، فقط مشاكل في الأداء.

وللإجابة على سؤالك الثالث:لا، هذا معقول تماما.تتمثل ميزة استخدام التدفقات في أنه يمكنك إدخال أي نوع من القيمة التي لها قيمة operator<< محددة، بينما يمكنك فقط إضافة سلاسل (إما C++ أو C) إلى ملف std::string.

من المفترض أنه عندما يكون الإدراج أو الاستخراج فقط مناسبًا لعمليتك، يمكنك استخدام أحد الإصدارات البادئة "i" أو "o" لاستبعاد العملية غير المرغوب فيها.

إذا لم يكن هذا مهمًا، فيمكنك استخدام إصدار i/o.

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

تقوم الدالة std::ostringstream::str() بإنشاء نسخة من محتوى الدفق، مما يضاعف استخدام الذاكرة في بعض المواقف.يمكنك استخدام std::stringstream ووظيفتها rdbuf() بدلاً من ذلك لتجنب ذلك.

مزيد من التفاصيل هنا: كيفية كتابة ostringstream مباشرة إلى cout

لماذا تفتح ملفًا للوصول للقراءة/الكتابة إذا كنت تحتاج فقط إلى القراءة منه، على سبيل المثال؟

ماذا لو كانت هناك حاجة لعمليات متعددة للقراءة من نفس الملف؟

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top