Aralık kütüphanesinde iki tür işlem vardır:
- tembel ve altta yatan kabın varlığını gerektiren görünümler .
- istekli olan ve sonuç olarak yeni kaplar üreten (veya mevcut olanları değiştiren) eylemler
Görüntüler hafiftir. Bunları değere göre iletirsiniz ve alttaki kapların geçerli ve değişmeden kalmasını istersiniz.
Kaynaktan aralıkları-v3 belgelerinde
Görünüm, altta yatan bir dizi öğenin, mutasyona uğratılmadan veya kopyalanmadan özel bir şekilde bir görünümünü sunan hafif bir sargıdır. Görünümler oluşturmak ve kopyalamak ucuzdur ve sahip olunmayan referans semantiğine sahiptir.
ve:
Temel aralıktaki yineleyicilerini veya sentinellerini geçersiz kılan herhangi bir işlem de, bu aralığın herhangi bir bölümünü ifade eden herhangi bir görünümü geçersiz kılacaktır.
Alttaki kabın imhası, açıkça tüm yineleyicileri geçersiz kılar.
Kodunuzda sen specifially kullandığınız görünümleri - Sen kullanmak ranges::views::transform
. Boru sadece olduğu gibi yazmayı kolaylaştırmak için sadece sözdizimsel bir şekerdir. Ne ürettiğinizi görmek için borudaki son şeye bakmalısınız - sizin durumunuzda bir görünümdür.
Boru operatörü olmasaydı, muhtemelen şöyle bir şey olurdu:
ranges::views::transform(my_custom_rng_gen(some_param), my_transform_op)
bu şekilde bağlı birden fazla dönüşüm olsaydı, ne kadar çirkinleşeceğini görebilirsiniz.
Böylece, my_custom_rng_gen
dönüştürdüğünüz ve sonra geri döndürdüğünüz bir tür konteyner üretiyorsa, o konteyner imha edilir ve sizin görüşünüzden sarkan referanslarınız olur. Eğer my_custom_rng_gen
bu kapsamları dışında yaşamlarını, her şey yolunda olduğuna dair bir konteynıra başka görünümüdür.
Ancak, derleyici geçici bir kapsayıcıya bir görünüm uyguladığınızı anlayabilmeli ve derleme hatasıyla size çarpabilmelidir.
İşlevinizin bir aralığı kapsayıcı olarak döndürmesini istiyorsanız, sonucu açıkça "gerçekleştirmeniz" gerekir. Bunun için ranges::to
işlevin içindeki operatörü kullanın .
Güncelleme: Yorumunuzla ilgili daha açıklayıcı olmak için "dokümantasyon aralık / boru oluşturmanın bir bakış açısını alıp kaydettiğini nerede söylüyor?"
Boru, şeyleri okunması kolay bir ifadeye bağlamak için sadece sözdizimsel bir şekerdir. Nasıl kullanıldığına bağlı olarak, bir görünüm döndürebilir veya döndürmeyebilir. Sağ taraftaki argümana bağlıdır. Sizin durumunuzda:
`<some range> | ranges::views::transform(...)`
Böylece ifade her ne views::transform
döndürürse onu döndürür.
Şimdi, dönüşümün belgelerini okuyarak:
Aşağıda, Range-v3'ün sağladığı tembel aralık birleştiricilerinin veya görünümlerinin bir listesi ve her birinin nasıl kullanılması amaçlandığı hakkında bir bulanıklık.
[...]
views::transform
Bir kaynak aralığı ve tekli işlev verildiğinde, her sonuç öğesinin tekli işlevi bir kaynak öğeye uygulamanın sonucu olduğu yeni bir aralık döndürün.
Bir dizi verir, ancak bunu bir tembel operatör olduğundan, bu döndüren aralığı Yani olan bir görünümü tüm semantik ile.