String_view nedir?


162

string_viewC ++ 17'ye eklenen C ++ Library Fundamentals TS ( N3921 ) içinde önerilen bir özellikti

Anladığım kadarıyla bu bir dize "kavramı" bir dize olarak görüntülenebilir bir şey depolayabilir konteyner herhangi bir tür bir görünümü temsil eden bir türüdür.

  • Bu doğru mu ?
  • Standart const std::string&parametre türü olmalı mı string_view?
  • string_viewDikkate alınacak başka önemli bir nokta var mı?

4
Son olarak, string_view'i tanıtmak sadece küçük bir adım olsa da, birisi stringlerin farklı bir semantiğe ihtiyacı olduğunu fark eder.
John Z. Li

Yanıtlar:


183

Her türlü "dize başvurusu" ve "dizi başvurusu" tekliflerinin amacı, başka bir yere ait olan ve yalnızca mutasyona uğramayan bir görünüme ihtiyaç duyulan verileri kopyalamaktan kaçınmaktır. Söz string_viewkonusu olan, böyle bir tekliftir; daha önce denilenler vardı string_refvearray_ref vardı.

Fikir her zaman bir çift işaretçi-ilk eleman ve mevcut bazı boyutlarını saklamaktır veri dizisi veya dizesinin .

Böyle bir görünüm tanıtıcı sınıfı değere göre ucuza aktarılabilir ve ucuz alt dize işlemleri sunar (basit işaretçi artışları ve boyut ayarlamaları olarak uygulanabilir).

Dizelerin birçok kullanımı dizelerin gerçekte sahiplenmesini gerektirmez ve söz konusu dizenin çoğu zaman başka birisine ait olacaktır. Dolayısıyla, gereksiz kopyalardan kaçınarak verimliliği artırmak için gerçek bir potansiyel vardır (kaydedebileceğiniz tüm tahsisleri ve istisnaları düşünün).

Orijinal C dizeleri, boş sonlandırıcının dize API'lerinin bir parçası olduğu sorunundan muzdaripti ve bu nedenle temel dizeyi (a la strtok) değiştirmeden kolayca alt dizeler oluşturamazsınız . C ++ 'da bu, uzunluğu ayrı ayrı saklayarak ve işaretçiyi ve boyutu bir sınıfa sararak kolayca çözülebilir.

Düşünebileceğim C ++ standart kütüphane felsefesinin önündeki en büyük engel ve sapma, bu tür "referans görünüm" sınıflarının, standart kütüphanenin geri kalanından tamamen farklı sahiplik semantiğine sahip olmasıdır. Temel olarak, standart kütüphanedeki diğer her şey koşulsuz olarak güvenli ve doğrudur (eğer derlerse, doğrudur). Bunun gibi referans sınıflarıyla, artık doğru değil. Programınızın doğruluğu, bu sınıfları kullanan ortam koduna bağlıdır. Bu yüzden kontrol etmek ve öğretmek daha zor.


19
Gemi bu felsefeye yelken açtı reference_wrapper, değil mi?
Steve Jessop

5
@KerrekSB Korkmuyorum takip etmiyorum. "Bu tür referans görünüm sınıflarının, standart kitaplığın geri kalanından tamamen farklı sahiplik semantiği var" bölümünü genişletebilir misiniz ? Benim için net değil: Sarkan referanslardan / işaretçilerden farkı nedir? Veya yerleştirme nedeniyle geçersiz kılınmış yineleyiciler (örn. Std :: vector)? Zaten bu sorunlarımız var, sahip olmayan bir görüşün sahip olmayan işaretçiler / referanslar / yineleyicilerle benzer sorunlara sahip olması benim için çok doğal.
Ali

5
@Ali: Başka bir standart kütüphane kabı kullanırken, yalnızca kapsayıcıyı kullanan koda bakarak kodun doğruluğunu iddia edebilirsiniz. Öyle değil string_view. (Asla kırık kod yazamayacağınızı söylemiyordum. Sadece kırılma olduğunu yereldir .)
Kerrek SB

6
Gitmediklerine şaşırdım std::range gelen boost::iterator_rangeIMO string_view fikri daha iyidir -
Charles Salvia

19
@nwp: Birçok insan ve dil, C ++ 'ın korkunç varsayılanlarına ağıt yaktı ve "mutabakat" ve "paylaşılmamış" ifadelerinin varsayılan olması gerektiğini düşünüyor.
Kerrek SB
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.