Niedawno zacząłem używać boost lambda i sądziłem, że spróbuję użyć go w miejscach, w których powinien/powinien ułatwić czytanie.Jak używać boost lambda do wypełnienia wektora wskaźników nowymi obiektami
Mam kod podobny do poniższego
std::vector< X * > v;
for (int i = 0 ; i < 20 ; ++i)
v.push_back(new X());
i później, aby go usunąć ...
std::for_each(v.begin(), v.end(), boost::lamda::delete_ptr());
Które starannie porządkuje się.
Jednak pomyślałem, że mam go na „lambda-Ising” populacji wektora za pomocą lambda ... To wtedy fajerwerki zaczęło ...
Próbowałem ..
std::generate_n(v.begin(), 20, _1 = new X());
ale to spowodowało wszystkie rodzaje błędów kompilatora.
Wszelkie pomysły, które są najlepszą metodą "lambda", aby to osiągnąć.
Thx Oznacz.
Generalnie nie przechowuj dynamicznie przydzielonych wskaźników w wektorze - Twój kod nie jest bezpieczny w wyjątkach i spowoduje wyciek pamięci, jeśli konstruktor X ulegnie awarii. –
Witaj Joe, byłbym zainteresowany rozszerzeniem tego. Nie jestem pewien, jak konstruktor X może zawieść i przeciekać pamięci. Myślałem, że standard C++ powiedział, że nowe, w obliczu wyjątków, zwróci wartość zerową i wyczyści pamięć przed ponownym wyrzuceniem wyjątku. Oczywiście mógłbym być całkowicie w błędzie. – ScaryAardvark
@SararyAardvark. New rzuca std :: bad_alloc, jeśli brakuje pamięci - nigdy nie zwróci wartości null, chyba że użyjesz formularza nie rzucającego. –