Witam Chcę (pomnożyć, dodać itp.) Wektor według wartości skalarnej na przykład myv1 * 3
, Wiem, że mogę wykonać funkcję z forloop, ale czy istnieje sposób na zrobienie tego używając funkcji STL? Coś w rodzaju funkcji {Algorithm.h :: transform}}?Pomnożenie elementów wektorowych przez wartość skalarną przy użyciu STL
Odpowiedz
Tak, używając std::transform
:
std::transform(myv1.begin(), myv1.end(), myv1.begin(),
std::bind1st(std::multiplies<T>(),3));
Jeśli możesz użyć valarray
zamiast vector
, ma wbudowane operatory do wykonywania mnożenia skalarnego.
v *= 3;
Jeśli trzeba użyć vector
można rzeczywiście korzystać transform
aby wykonać zadanie:
transform(v.begin(), v.end(), v.begin(), _1 * 3);
(zakładając, że masz coś podobnego do Boost.Lambda, który pozwala na łatwe tworzenie anonimowych obiektów funkcyjnych takich jak _1 * 3
:-P)
Valarrays są poprawnym rozwiązaniem IMO. Przy odrobinie szczęścia twoja implementacja używa instrukcji SSE do implementacji procedury, co znacznie przyspiesza. Zobacz http://www.pixelglow.com/macstl/valarray/ dla jednej z takich realizacji valarray. Niestety, nie jest to zbyt rozpowszechnione, więc jeśli chcesz mieć zalety instrukcji SSE, prawdopodobnie będziesz musiał użyć wbudowanego kompilatora ... – Dragontamer5788
@Dragon: 'valarray' jest najlepszym rozwiązaniem STL, ale nie jest zbyt dobre dla wysokiej wydajności przetwarzanie, ponieważ ma tendencję do częstego kopiowania danych w pamięci i tworzy sekwencje małych pętli zawierających pojedyncze operacje, które mają słabe wzorce dostępu do pamięci. Łatwiej jest jednak dokonać aktualizacji z 'valarray' do odpowiedniego systemu szablonów wyrażeń. – Potatoswatter
Po prostu: jeśli dane mogą być przechowywane w macierzy o ustalonej wielkości (wartości zmiennoprzecinkowe [N]), można użyć indeksu wewnętrznego SSE, aby przyspieszyć, ponieważ będzie ono mnożyć zmienną sevreral (4).
Wiem, że nie STL, jak chcesz, ale jest to coś, co można dostosować, gdy pojawiają się różne potrzeby.
Poniżej znajduje się szablon, którego można użyć do obliczenia; "func" będzie funkcją, którą chcesz zrobić: mnożyć, dodawać itd .; "parm" to drugi parametr funkcji "func". Możesz łatwo rozszerzyć to, aby uzyskać różne funkcje z większą ilością różnych rodzajów parm.
template<typename _ITStart, typename _ITEnd, typename _Func , typename _Value >
_ITStart xform(_ITStart its, _ITEnd ite, _Func func, _Value parm)
{
while (its != ite) { *its = func(*its, parm); its++; }
return its;
}
...
int mul(int a, int b) { return a*b; }
vector<int> v;
xform(v.begin(), v.end(), mul, 3); /* will multiply each element of v by 3 */
Ponadto nie jest to funkcja "bezpieczna", należy przed jej użyciem wykonać sprawdzanie typu/wartości itp.
To działa, ale jest w istocie odkrywaniem koła, ponieważ 'std :: transform' już to robi dla ciebie. –
Tak - widziałem w zaakceptowanej odpowiedzi ... ale czy zdajesz sobie sprawę, jaką przyjemność sprawia wynalezienie koła, które faktycznie działa;) W każdym razie zastrzelę siebie w dniu, w którym zostanę konformistą;) – slashmais
myślę for_each
jest bardzo trafne, gdy chcesz przemierzać wektor i manipulować każdy element według pewnego wzorca, w tym przypadku proste lambda wystarczyłby:
std::for_each(myv1.begin(), mtv1.end(), [](int &el){el *= 3; });
uwagę, że każda zmienna chcesz uchwycić dla funkcji lambda (powiedzmy, że chcesz np. pomnożyć się z pewnym z góry określonym skalarem), przechodzi do nawiasu jako odniesienie.
To nie jest celem std :: for_each'. 'std :: for_each' stosuje pewien (prawdopodobnie stanowy) obiekt funkcji do zakresu, a następnie zwraca ten obiekt funkcji. Jeśli chcesz przekształcić zakres, użyj 'std :: transform', aby twoje intencje były wyraźniejsze. – sv90
- 1. SSE (SIMD): pomnóż wektor przez skalarną
- 2. Wybierz wartość skalarną z tabeli
- 3. Pozycja w wektorze przy użyciu STL
- 4. C++ dla każdego, ciągnięcie z elementów wektorowych
- 5. wartość Suma elementów wewnątrz div przy użyciu jQuery
- 6. Dynamiczne tworzenie elementów przy użyciu jQuery
- 7. Czy mogę serializować mapę STL w MFC przy użyciu CArchive?
- 8. dopuszczalne algorytmy STL do N elementów
- 9. W R: Łączenie elementów wektorowych według wierszy, konwertowanie wierszy wektorowych na ciągi znaków
- 10. Porady przy użyciu obiektu COM/CComPtr i STL
- 11. Wyodrębnianie i usuwanie elementów przy użyciu xmlstarlet
- 12. UserControl przy użyciu elementów macierzystych w wpf?
- 13. Dołączanie wielu elementów przy użyciu jQuery
- 14. Kolejność elementów zwracanych przy użyciu metody getElementsByTagName()
- 15. Wyświetlanie elementów w TreeView przy użyciu MVVM
- 16. Używanie numpy elementów wektorowych w module Fraction w Pythonie
- 17. Jak mogę wektoryzować dostęp do sąsiednich elementów wektorowych w R?
- 18. Jak uzyskać wartość skalarną na komórce za pomocą warunkowego indeksowania
- 19. Python 3: Pomnożenie wektora przez macierz bez NumPy
- 20. MySQL: Pomnożenie wszystkich wartości z rzędu przez 2
- 21. Pomnożenie długich wartości?
- 22. gwarantowana lokalizacja punktów wektorowych?
- 23. Jak sprawdzić wartość EIP przy użyciu asemblera?
- 24. Uzyskaj wartość zawartości div przy użyciu jquery
- 25. Jak uzyskać wartość div przy użyciu javascript
- 26. zwiększyć/zmniejszyć wartość pola przy użyciu jQuery
- 27. Uzyskaj domyślną wartość wejścia przy użyciu jQuery
- 28. Jak uzyskać wartość atrybutu przy użyciu XPath
- 29. Mathematica: Wyciąg wartość liczbową przy użyciu Rozwiąż
- 30. wsparcie kopiowanie przy zapisie w STL
Wielkie dzięki, że to geniusz !! –