2017-04-24 6 views
5

Pytanie o wektor vs walarray zostało już zadane here. Moje pytanie dotyczy konkretnie przypadku C++ 11. Czytałem "A Tour of C++" i "The C++ Programming Language". Obie książki zostały napisane przez Bjarne Stroustrup. W pierwszej książce autor wyjaśnia, że ​​do obliczeń numerycznych powinno być preferowane std::valarray (rozdział 12). Ale w drugiej książce, w rozdziale 29, autor implementuje klasę Matrix w kategoriach std::vector.C++ 11: czy powinienem używać valarray lub wektor do obliczeń numerycznych

Również wykonując trochę googling, wydaje się, że pod względem wydajności, std::vector jest tak samo szybki, jak dynamicznie przydzielane "surowe tablice".

Tak więc w kontekście C++ 11, który pojemnik powinien być preferowany do obliczeń numerycznych?

My się na to byłoby to, że od std::vector zapewnia szybki dostęp do jego zawartości przy użyciu operator[] (która zwraca odwołanie do danych bez żadnych granic sprawdzania) i że jest również bezpieczniejsze w użyciu std::vector nad dynamicznie przydzielonego tablicy , Preferowane powinno być std::vector. Również z C++ 11 r:

  • std::vector zapewnia bezpośredni dostęp do podstawowych danych z wykorzystaniem std::vector::data()
  • std :: vector może być zmieniany w celu użycia mniejszej ilości pamięci używając std::vector::shrink_to_fit()
+1

Dlaczego nie można zmierzyć i sprawdzić, który byłby szybszy. W nowoczesnym świecie C++, std :: vector powinien być użyty jako domyślny kontener, chyba że mamy powód, aby tego nie robić. –

Odpowiedz

2

valarray ma ładne functionality, że łatwo można zastosować funkcje matematyczne w sposób elementarny i masz lepsze możliwości krojenia. Możesz np. zrobić v3 = sin(v2 + v1*3)

Niemniej jednak, jeśli naprawdę chcesz robić obliczenia naukowe, należy rozważyć przy użyciu biblioteki takich jak Eigen

+1

Jestem świadomy Eigen, Armadillo, MTL4, a także wielu innych bibliotek macierzy. Jednym z problemów z tymi bibliotekami jest to, że ich kod źródłowy jest całkowicie nieprzejrzysty (innymi słowy jest trudny jako narzędzie do nauki, lub gdybym chciał coś zmienić samodzielnie). Moje pytanie jest również bardziej pojęciowe. Rozumiem, że std :: valarray to "niedokończony biznes" – BigONotation

Powiązane problemy