İstringstream, ostringstream ve stringstream arasındaki fark nedir? / Neden her durumda stringstream kullanmıyorsunuz?


163

Kullandığım ne zaman std::istringstream, std::ostringstreamve std::stringstreamben sadece kullanmamalısınız neden std::stringstreamher senaryoda (herhangi bir çalışma zamanı performansı sorunları vardır?).

Son olarak, bu konuda kötü bir şey var mı (hiç bir akış kullanmak yerine):

std::string stHehe("Hello ");

stHehe += "stackoverflow.com";
stHehe += "!";

Yanıtlar:


119

Şahsen, ben aynı dize akışı içine ve dışına akış gerçekleştirmek istiyorum çok nadir buluyorum.

Genellikle bir dize bir akış başlatmak ve sonra ayrıştırmak istiyorum; veya bir dize akışına bir şeyler aktarın ve ardından sonucu çıkarın ve saklayın.

Aynı akışa / akışından akış yapıyorsanız akış durumu ve akış konumlarına çok dikkat etmelisiniz.

'Sadece' kullanılması istringstreamveya ostringstreamdaha iyi niyet ifade eden ve size böyle yanlışlıkla kullanımı gibi saçma hataları karşı bazı kontroller verir <<vs >>.

Orada olabilecek bazı performans iyileştirme olabilir ama ben ilk o bakıyor olmaz.

Yazdıklarınızla ilgili yanlış bir şey yok. Yeterince iyi performans göstermediğini fark ederseniz, diğer yaklaşımları da profil haline getirebilirsiniz, aksi takdirde en net olana sadık kalın. Şahsen, sadece:

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

22

A stringstreambiraz daha büyüktür ve biraz daha düşük performansa sahip olabilir - çoklu kalıtım, vtable işaretçisinde bir ayar gerektirebilir. Temel fark (en azından teoride) niyetinizi daha iyi ifade etmek ve yanlışlıkla >>istediğiniz yerde <<(veya tersini) kullanmanızı önlemektir . OTOH, fark özellikle gösteri kodu hızlı bitleri için yeterince küçük ve ben tembel ve sadece kullanıyorum stringstream. Oldukça yanlışlıkla kullanılan son kez hatırlayamıyorum <<ben amaçlanan zaman >>(eğer varsa özellikle bu yüzden bana güvenlik Sinirin çoğunlukla teorik görünüyor yapmak böyle bir hata yaparsanız, neredeyse her zaman olacak gerçekten neredeyse hemen aşikar).

İstediğiniz şeyi gerçekleştirdiği sürece, sadece bir dize kullanarak hiçbir şey yanlış değil. Dizeleri bir araya getiriyorsanız, kolay ve iyi çalışıyor. Diğer veri türlerini biçimlendirmek istiyorsanız, stringstreambunu destekleyecek ve bir dize çoğunlukla desteklemeyecektir.


17

Çoğu durumda, aynı dize akışında hem giriş hem de çıkışa ihtiyacınız olduğunu bulamazsınız, bu nedenle kullanmak std::ostringstreamve std::istringstreamaçıkça niyetinizi netleştirir. Ayrıca yanlışlıkla yanlış operatörü ( <<vs >>) yazmanızı da önler .

Her iki işlemi de aynı akışta yapmanız gerektiğinde, genel amaçlı sürümü açıkça kullanırsınız.

Performans sorunları burada endişelerinizden en az biri olacaktır, netlik ana avantajdır.

Son olarak, saf dizeler oluşturmak zorunda kaldığınızda string append kullanmanın yanlış bir yanı yoktur. Bunu perl gibi dillerde olabildiğince sayıları birleştirmek için kullanamazsınız.


8

istringstream girdi içindir, ostringstream çıktı içindir. stringstream girdi ve çıktıdır. Dize akışını hemen hemen her yerde kullanabilirsiniz. Ancak, nesnenizi başka bir kullanıcıya verirseniz ve bu işleç >> kullanırsa, yalnızca yazma nesnesini beklerken siz mutlu olmazsınız ;-)

PS: bu konuda kötü bir şey değil, sadece performans sorunları.


2

Üçüncü sorunuza cevap vermek için: Hayır, bu son derece makul. Akışları kullanmanın avantajı, operator<<tanımlı herhangi bir değer girebilmenizdir. A'ya yalnızca dize (C ++ veya C) ekleyebilirsiniz std::string.


1

Muhtemelen sadece ekleme veya sadece çıkarma işlemi için uygun olduğunda, istenmeyen işlemi hariç tutmak için 'i' veya 'o' ön ekli sürümlerinden birini kullanabilirsiniz.

Bu önemli değilse, i / o sürümünü kullanabilirsiniz.

Gösterdiğiniz dize birleştirme işlemi tamamen geçerlidir. Her ne kadar stringstream kullanarak birleştirme mümkün olsa da, bu stringstreams'in en kullanışlı özelliği değildir, bu da POD ve soyut veri tiplerini ekleyip çıkarabilmektedir.



0

Örneğin, yalnızca dosyadan okumaya ihtiyaç duyuyorsanız neden okuma / yazma erişimi için bir dosya açalım?

Aynı dosyadan birden fazla işlemin okunması gerekiyorsa ne olur?

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.