2011-11-16 17 views
9

Bu iki mass ve velocity her ikisi de aynı boyutta N var. N parçacıkların kütlesi ve hızı hakkında bilgi içerirler. mass[i] ve velocity[i], bu nedenle, i ++ parçacıkİki vektörü kilitleme ve bunları sıralama

'un özellikleridir. Bu iki vektörü birlikte "kilitlemek" için C++ 'da kullanılabilir mi? Böylelikle, sıralama sonrası mass vektörü artan sırada olmalıdır ve hız vektörü, sıralanmış kütlelerin

ilgili hızlarını içermelidir. Kütle = (4,2,1,3) ve hız = (13, 14, 15, 16) sınıflandırılmadan önce Kütle = (1,2,3,4) ve hız = (15, 14, 16, 13) ayrıldıktan sonra)

Bunun için bilmek on (etkin olmayan) bir şekilde < aşırı ile std::sort kullanarak bu vektör yapı en

struct particle 
{ 

double mass; 
double velocity; 


bool operator < (const particle& str) const 

{ 
    return (mass < str.mass); 
    } 



}; 

bir vektör içerisine veri aktarımı ve vector<particle> particlelist(N) oluşturmak ve sonra sıralamak

olan Yukarıdaki tanımda yaptığım gibi operatör.

Verileri Diziler Yapısı yaklaşımına (en azından CUDA'ya) kıyasla verimsiz olduğunu duyduğumdan, verilerimi Yapılar Dizisi modasına koymak istemiyorum.

+0

yol açabilecek çünkü daha iyi biri, tesisi başka değişiklikler i aynı şekilde değiştirirse gibi demek "kilit"? –

+0

Soruyu düzenledim ve açıklığa kavuşturdum. – smilingbuddha

+0

İlgili: http://stackoverflow.com/questions/3398819/sort-by-proxy-or-sort-one-container-by-the-contents-of-another-in-c –

cevap

5

En azından bildiğim kadarıyla, sıralama algoritmalarının hiçbiri oluşturulmamıştır. standart kütüphaneye doğrudan sizin için bunu yapacağız. En belirgin olasılık muhtemelen iki dizinin tek bir koleksiyon gibi davranmasını sağlamak için bir Boost Zip Iterator kullanmak olacaktır. Eğer bağlantılıdır iki değere sahip olarak

+2

[zip_iterator, std :: sort] ile çalışmaz (http://stackoverflow.com/a/9343991). – jhoffman0x

10

Vektör dizinleri oluştur; Eğer her iki dizide de öğelerin vektör endeksleri sırayla sahip daha 0..n-1

struct CmpMass { 
    { 
     CmpMass(vector<double>& vec) : values(vec){} 
     bool operator() (const int& a, const int& b) const 
     { 
      return values[a] < values[b]; 
     } 
     vector<double>& values; 
    } 

sort(indexes.begin(), indexes.end(), CmpMass(mass)); 

daha değerleriyle doldurun. Kütle/hız vektörlerini doğru sırada oluşturabilir veya erişim sırasında indeksi dönüştürebilirsiniz: kütle [indeks [i]], hız [indeksler [i]]

5

Neden destekler std::sort bir aşırı versiyonu var (pointer aracılığıyla std::sort işlevine aktarmak sonra kendi karşılaştırma yöntemi/fonksiyonunu uygulayabilirsiniz değil, size std::pair kullanmayın) o.

Ama eğer bir strict weak ordering hayata sahip olduğunuzdan emin olun, başka std::sort tanımlamak bir SEGFAULT

İlgili konular