2016-04-12 27 views
1

Yineleyicileri kullanarak basit bir çift dizi üzerinde yinelemek istiyorum. Bunu gerçekten nasıl yapabileceğimi merak ediyorum. Bazılarınızın tahmin edebileceğiniz gibi, dizi bir araya sokulmuş karmaşık sayı gerçek ve hayali dizilerine ayrılacağız istiyorum yani,Yineleyicileri kullanarak bir dizi üzerinde yineleme

void foo(double* array, size_t size) 
{ 
    std::vector<double> real(size); 
    std::vector<double> imag(size); 
    auto arrBegin = std::begin(array); // this of course doesn't work 
    auto arrEnd = std::end(array); // this of course doesn't work 

    bool toggle = false; 

    std::partition_copy(arrBegin, arrEnd, std::begin(real), std::begin(imag), 
       [&toggle] (int) {return toggle != toggle}); 

    //Do other stuff 
} 

: Ben istiyorum ne

böyle bir şeydir Bölüm.

Dizinin boyutunu bildiğimde işaretçi olarak aldığım bir diziyi kullanmanın bir yolu var mı, yoksa dizinin çalışması için std :: vektörü gibi ayrı bir sınıf kullanmam gerekiyor mu? yineleyiciler ile?

std :: partition_copy() işlevini kullanmayı çok isterim, ancak diğer fikirlere açığım.

Not: Derleme sırasında dizi boyutu bilinmediği için std :: array kullanamıyorum. std :: vektör mümkün olabilir, ancak aslında bir API'dan diziyi alıp olduğu gibi kullanmak istediğim std :: vector olmadan bunu yapmanın mümkün olup olmadığını görmek istiyorum.

+0

Bu nedenle, ['std :: array'] (http://en.cppreference.com/w/cpp/container/array) kullanmalısınız. –

+0

Vektörlerinizin çıkış aralıklarını tutacak kadar büyük olmadığını unutmayın. –

+1

İlgisiz bir notta, * size * sahipseniz, 'size_t' işlevini kullanın. 64 bitlik bir sistemde, büyük olasılıkla "uint64_t" gibi bir imzasız 64 bitlik tamsayı türünün bir takma adıdır, ancak kodun okuyucusuna daha fazla anlamsal bilgi aktarır. –

cevap

2

Yinelemeniz olarak array ve array + size kullanın.

Vektörler için muhtemelen inserter-iterators'u da kullanmak istiyorsunuz.

#include <algorithm> 
#include <iterator> 

std::partition_copy(array, array + size, 
        std::back_inserter(real), 
        std::back_inserter(imag), 
        [&toggle](int t){ return t != toggle; }); 
+1

Bu cevap bazı açıklamalar gerektirir. Ne yapıyorsun, bu oldukça gelişmiş. – Chiel

+0

@Chiel: Bunun hangi kısmı belirsiz ve ilgili dokümanlar tarafından kapsanmıyor mu? –

+0

Neden arka yerleştiriciler? Neden lambda işlevindeki değişiklik? Sadece anladım eğer çözümünüz zarif görünüyor. – Chiel

İlgili konular