Cppreference için şu örnek kod vardır std::transform:
std::vector<std::size_t> ordinals;
std::transform(s.begin(), s.end(), std::back_inserter(ordinals),
[](unsigned char c) -> std::size_t { return c; });
Ancak şunu da söylüyor:
std::transformunary_opveya 'nın siparişe göre uygulanmasını garanti etmezbinary_op. Bir diziye sırayla bir işlev uygulamak veya bir dizinin öğelerini değiştiren bir işlevi uygulamak için kullanınstd::for_each.
Bu muhtemelen paralel uygulamalara izin vermek içindir. Bununla birlikte, üçüncü parametresi aşağıdaki son koşula sahip olan std::transformbir a parametresidir :LegacyOutputIterator++r
Bu işlemin
rartırılabilir olması gerekmez ve önceki değerinin herhangi bir kopyasınınrartık silinemez veya artırılabilir olması gerekmez.
Bu yüzden çıkış atama geliyor bana gereken sırayla olur. Uygulamanın düzensiz unary_opolabileceği ve geçici bir yerde saklanabileceği, ancak sırayla çıktıya kopyalanabileceği anlamına mı geliyor? Bu hiç yapmak isteyeceğiniz bir şey gibi gelmiyor.
Çoğu C ++ kütüphanesi aslında paralel yürütücüler uygulamamıştır, ancak Microsoft uygulamıştır. Ben eminim bu ilgili kod ve ben düşünüyorum o çağıran bu populate()fonksiyonu elbette çünkü yapmak için geçerli bir şey değildir çıktı, parçaları rekor Yineleyicilerin için LegacyOutputIteratorkopyalarını artırarak geçersiz edilebilir.
Neyi kaçırıyorum?
syineleyicileri geçersiz kılan kodunuz yanlış .
std::transformzorla alma politikası ile daha sonra rasgele erişim yineleyici gereklidir hangi back_inserteryerine getiremez. IMO tarafından belirtilen parça dokümantasyonu bu senaryoyu ifade eder. Doküman kullanımındaki örneğe dikkat edin std::back_inserter.
transformsürümü ile paralelliği kullanıp kullanmayacağınıza karar verir.transformBüyük vektörler için başarısız olur.