C ++ 26 Kütüphane: Geliştirilmiş Dizeler İşleme

Adanali

Active member
C ++ 26 Kütüphane: Geliştirilmiş Dizeler İşleme
Büyük iyileştirmelere ek olarak, yakın C ++ 26 standardı birçok daha küçük ama kullanışlı ekleme sunar. Bugün teller ve hakkında string_view.








Rainer Grimm yıllardır yazılım mimarı, ekip ve eğitim müdürü olarak çalıştı. C ++ programlama dilleri, Python ve Haskell hakkında makaleler yazmayı seviyor, ancak uzman konferanslarla konuşmayı da seviyor. Modern C ++ blogunda, C ++ tutkusuyla yoğun bir şekilde ilgileniyor.













Her şeyden önce: biri string_view?

std::string_view


A std::string_view Bir dizenin sahip olmayan bir referansıdır. Bir dizenin görünümünü temsil eder. Bu dize bir C ++ çizim zinciri veya bir C-imza zinciri olabilir. Genel olarak, C ++ 17, altta yatan tasarım türleri için dört tip eşanlamlı sunar.


std::string_view std::basic_string_view<char>
std::wstring_view std::basic_string_view<wchar_t>
std::u16string_view std::basic_string_view<char16_t>
std::u32string_view std::basic_string_view<char32_t>


Bu bir soru olmaya devam ediyor: çünkü buna ihtiyacımız var std::string_view? Google, LLVM ve Bloomberg neden zaten bir dize görünümü uyguladılar? Cevap basit: Bir kaynak, bir std::string_view kopyalamak için. A std::string_view Sadece iki bilgiye ihtiyacım var: dizideki işaretçi ve uzunluğu. Şüphelendiğiniz gibi, devam ediyorlar std::string_view ve üç erkek kardeşi, arayüzünden daha çok okuma operasyonlarından std::string sonuçlar. Her şeyden önce çünkü onlar yeni yöntemler remove_prefix VE remove_suffix almak.

Başarısı veya başarısızlığı için test edincharconv> -Pl.

İşlevler std::to_chars VE std::from_chars Sadece hacimli test edilebilir: if(res.ec == std::errc{}).
İşte basitleştirilmiş bir cppReference.com programı:


// charconv.cpp

#include <charconv>
#include <iomanip>
#include <iostream>
#include <string_view>
#include <system_error>

template <typename T>
void show_to_chars(T value) {
const size_t buf_size = 5;
char buf[buf_size];
std::to_chars_result result = std::to_chars(buf, buf + buf_size, value);

if (result.ec != std::errc{})
std::cout << std::make_error_code(result.ec).message() << 'n';
else{
std::string_view str(buf, result.ptr - buf);
std::cout << std::quoted(str) << 'n';
}
}

int main() {
show_to_chars(42);
show_to_chars(1234567);
}


Program başlığı içerircharconv> Karakterin dönüştürülmesi için,iomanip> Giriş/çıkış manipülatörleri için,string_view> Tedavisi için string_views VEsystem_error> Hataların tedavisi için.

Fonksiyonel model show_to_chars Her türlü değeri alır T Bir dizeye karşı koymaya doğru. Ortaya çıkan dizeyi kaydetmek için işlev içinde 5 boyutlu bir arabellek bildirilir. İşlev std::to_chars Daha sonra dönüşümü ve sonucu bir std::to_chars_result-Bject Arandı result kaydetmek.

Sonuç nesnesi, dönüştürülen dizenin sonunda bir işaretçi ve bir hata kodu içerir. Hata kodu eşit değilse std::errc{} Dönüşümde bir hatayı gösteren şey, std::make_error_code(result.ec).message() Konsolda piyasaya sürüldü. Aksi takdirde bir std::string_view-Giot dönüştürülmüş dizeyi sunmak için yaratıldı ve sonuç std::quoted Tırnak işaretleri içinde görüntülenmesini sağlamak için konsolda yayınlandı.

İçinde mainİşlev işlevdir show_to_chars İki kez arandı: Önce değerle 42 Ve sonra değerle 1234567. İlk çağrı değeri değiştirir 42 Bir dizeye doğru şekilde dönüştürün ve bunları harcar. Ancak ikinci çağrıda denemeler yapılır 1234567 5 tamponun boyutunu aşan dönüştürmek için, bu da konsolda bir hata mesajı yayıldığı anlamına gelir.

Son olarak, program yayınlandı:








C ++ 26 sayesinde işlev verir std::to_chars bir boolean geri ve işlev show_to_chars Basitleştirilebilir:


template <typename T>
void show_to_chars(T value) {
std::array<char, 5> str;
if (auto result = std::to_chars(str.data(), str.data() + str.size(), value)) {
std::string_view strView(str.data(), result.ptr);
std::cout << std::quoted(strView) << 'n';
}
else
std::cout << std::make_error_code(result.ec).message() << 'n';
}


İşlev içinde bir std::array Ortaya çıkan dizeyi kaydetmek için sabit boyutta 5 olan karakterlerden ilan edildi. İşlev std::to_chars Daha sonra dönüşümü gerçekleştirmek için çağrılır. Bu işlev, sayısal değeri bir dizeye ve diziye dönüştürmeye çalışır str kaydetmek. İşlev std::to_chars verir std::to_chars_result-Pepplet Back, dönüştürülmüş dizenin sonunda bir işaretçi ve bir hata kodu.

İşlev bir dosya kullanır ifSonucuna yönelik talimatlar std::to_chars-Hia kontrol etmek. Dönüşümün olumlu bir sonucu varsa, sonuç dolaylı olarak true Dönüştürülmüş ve dönüştürülmüş dizenin ifadesi ile sürekli fonksiyon. Bunu yapmak için std::string_view-Nesne strView String'in başlangıcından itibaren str– result.ptr-Peiger temsil eder. . std::cout-Stream daha sonra konsolda bu görüş ipini üretmek için kullanılır, bu nedenle std::quoted Çıktının alıntılar içinde görüntülenmesini garanti eder.

Dönüşüm başarısız olursa, sonuç dolaylı olarak false Dönüştürülmüş ve işlev bunun yerine bir hata mesajı yayar. Hata mesajı arayarak elde edilir std::make_error_code(result.ec).message()Bu, hata kodunu insanlar için bir karakter zincirine dönüştürür.
C ++ 26'da işleme için başka işlevler var stringkum string_viewS:

  • Dizelerin akışlarının bağlantısı std::string_view
  • Dizelerin ve String_Views'in metinasyonu
  • Aritmetik aşırı yük std::to_string ve kullanımı std::format
Önceki yazımda zaten sundum: “C ++ 26'ya genel bir bakış: Kütüphane”.

Sırada ne var?


Bir sonraki yazım, C ++ 26 kitapçısının sunabileceği çok daha fazlası olduğunu gösteriyor.


(RME)
 
Üst