2017-04-24 19 views
5

Vector vs valarray ile ilgili soru here'a sorulmuştur. Soruma özellikle C++ 11 örneğini ifade eder. "A Tour of C++" ve "The C++ Programming Language" okuyorum. Her iki kitap da Bjarne Stroustrup tarafından yazılmıştır. İlk kitapta yazar, sayısal hesaplama için std::valarray'un tercih edilmesi gerektiğini açıklamaktadır (Bölüm 12). Fakat sonra ikinci kitapta, bölüm 29'da, yazar bir Matrix sınıfını std::vector açısından uygular.C++ 11: sayısal hesaplama için valarray veya vektör kullanmalıyım

Ayrıca, biraz googling yaparak, performans açısından, std::vector dinamik olarak ayrılmış "ham diziler" kadar hızlı görünüyor.

C++ 11 kapsamında, sayısal hesaplama için hangi konteyner tercih edilmelidir?

bu almak benim olacağını std::vector (hayır sınırları denetleme verilere bir başvuru verir) operator[] kullanarak içeriğinin hızlı erişim sağlar ve bu kadar dinamik olarak atanan dizisi üzerinde std::vector kullanmak da güvenlidir çünkü std::vector tercih edilmelidir. itibaren C++ 11 da :

  • std::vectorstd::vector::data()
  • Std :: vektör kullanılarak temel veri doğrudan erişim sağlar kullanılarak daha az bellek kullanmak için boyutlandırılmış olabilir std::vector::shrink_to_fit()
+1

olarak kütüphane kullanmayı düşünün isterseniz, Yine v3 = sin(v2 + v1*3)

yapmak. Modern C++ dünyasında, yapmamamız gerekmedikçe std :: vektörü varsayılan olarak kullanılmalıdır. –

cevap

2

valarray, functionality numaralı güzelliğe sahiptir; matematiksel fonksiyonları elementel olarak kolayca uygulayabileceğiniz ve daha iyi dilimleme yeteneklerine sahip olduğunuz. Ör. Gerçekten, bilimsel bilgi işlem yapmak Neden ölçmek ve daha hızlı olacağını doğrulamazsanız böyle Eigen

+1

Eigen, Armadillo, MTL4 ve diğer birçok matriks kütüphanesinin farkındayım. Bu kütüphanelerle ilgili problemlerden biri, kaynak kodlarının tamamen opak olmasıdır (başka bir deyişle, bir öğrenme aracı olarak zor veya kendimi değiştirmek istediğimde). Benim sorum da kavramsal olarak daha fazla. Benim anlayışım şu ki: std :: valarray "bitmemiş iş" – BigONotation