Czy można użyć czegoś takiego jak generate_n
, aby utworzyć const vector
, powiedzmy, liczb losowych? Nie mogłem wymyślić sposobu, aby to zrobić bez wyprowadzania vector
i wykonywania przypisania w konstruktorze.Jak zainicjowałbyś wektor const wyników funkcji używając C++ 11?
Odpowiedz
Użyj statycznego pomocnika lub lambda, jeśli chcesz; przesuń semantykę/copy elision, jak wskazano w komentarzach, sprawi, że będzie to dość tanie, ponieważ wszystkie przyzwoite kompilatory pominą pełną kopię wektora zwróconego przez pomocnika. Zamiast tego będą po prostu tworzyć kod, aby wypełnić pojedynczy wektor, a następnie użyć go.
std::vector<int> Helper()
{
const size_t n = 10;
std::vector<int> x(n);
std::generate_n(x.begin(), n, someGenerator);
return x;
}
const std::vector<int> my_const_vec(Helper());
tutaj jest wersja lambda:
const std::vector<int> my_const_vec([]()
{
const size_t n = 10;
std::vector<int> x(n);
std::generate_n(x.begin(), n, someGenerator);
return x;
}());
Przy tak prostym pomocniku większość kompilatorów całkowicie wymusi kopiowanie. – Agentlien
Przy okazji, zgodnie z * bieżącym * standardem, twoja lambda potrzebuje '-> std :: vector
hmm teraz jestem zdezorientowany. Próbowałem z gcc4.7 i cl17.00 i obaj to akceptują, ale wydaje mi się, że pamiętam poprzednie wersje obu, które by je odrzuciły. – stijn
enkapsulacja inicjalizacji do funkcji i uznaniu jej za „constexpr”, dzięki czemu można używać go zainicjować const wyraz.
Nie ma tu potrzeby "constexpr", ponieważ nie potrzebuje on kompilacji wyrażenia stałej czasowej (której zwrot "std :: vector" nigdy nie może być, tak czy inaczej). –
Można użyć std::transform
także
vector<int> vec(10,1);
transform(vec.begin(), vec.end(), vec.begin(), func);
Gdzie func jest:
int func(int i)
{
//return a random generated number
}
- 1. wektor przyszłości w C++ 11
- 2. C++ sortuj wektor używając obiektu funkcji
- 3. Konst wektor const obiektów
- 4. wektor wskaźników const?
- 5. C++ 11 std :: wektor w środowisku współbieżnym
- 6. C++ 11 rodzaj odliczenie vs const char *
- 7. używając symboli zastępczych C++ 11 jako lambdas?
- 8. jak initializ statyczną const vector klasy członka w C++ 11
- 9. C++ 11 lambdas do wskaźnika funkcji
- 10. zainicjować wektor do zera w C++/C++ 11
- 11. C++ 11 lambdas jako domyślne argumenty funkcji
- 12. Jak podzielić wektor na kolumny - używając PySpark
- 13. inicjalizacja wektora C++ 11 w wywołaniu funkcji
- 14. Dlaczego C++ 11 nie przenosi niezideikowalnego funktora do funkcji std ::?
- 15. Zmiany funkcji const obiekt
- 16. Wyłączanie funkcji C++ 11 w VS2012
- 17. C: Przypisywanie "static const char * const" do "const static char *"
- 18. C++ wektor inicjujący
- 19. C++ 11 Destructor = delete
- 20. Zestaw na wektor C++
- 21. metody Const w C#
- 22. C++ wektor gromadzi
- 23. C++ std :: transformuj wektor par-> pierwszy na nowy wektor
- 24. C++ Jak sortować wektor bitsetów?
- 25. Używając Qt Creator C++ 11, nullptr jest słowem kluczowym?
- 26. Jak napisać wskaźnik funkcji za pomocą składni C++ 11?
- 27. Jak korzystać z funkcji C++ 11 w Autoconf?
- 28. Wywoływanie funkcji automatycznie na wyjściu std :: thread w C++ 11
- 29. wektor w funkcji - jak to zrobić powrót
- 30. std :: wektor jako argument funkcji szablonu
Wiem, że masz odpowiedź na to teraz, ale po prostu FYI wynikające 'vector' (lub innego rodzaju w' przestrzeń nazw std ", która nie jest przeznaczona do wyprowadzenia) jest [ryzykowne] (http://stackoverflow.com/questions/2034916/is-it-okay-to-inherit-implementation- from-stl-containers-rather-than-delegate) – boycy