Rzucanie wyjątków

0

Cześć,
jedna z części mojego zdania zakłada wypełnienie kontenera A 100 000 pseudolowowymi wynikami z rozkładu gamma gdzie alfa=3,71 beta=1. W przypadku gdy wynik wartosć rozkladu bedzie wieksza niż 18.0 to ma zostać rzucony wyjątek.Obsługa wyjątku będzie polegać na wypisaniu w oknie konsoli że liczba jest wieksza od 18 i pominięciu tej liczby. Po obsłużeniu wyjątku program kontynuuje pobieranie kolejnych wartości z generatora i zapisywanie ich do kontenera A.
Nie mogę uzywać pętli,tylko algorytmy z STL i nie wiem za bardzo gdzie mam ustalić te sekcje wyjątków jeśli do wypełnienia kontenera używam generate-a.

#include <iostream>
#include <vector>
#include <functional>
#include <random>
#include<algorithm>

using namespace std;

random_device rd;
double rozkladGamma()
{

	mt19937 gen(rd());
	gamma_distribution<double> distribution(3.71, 1.0);
	return distribution(gen);
}

int main()
{

	vector<double> A(100000);

	generate(A.begin(),A.end(),rozkladGamma);

}

Czy mogę w generate uzyc lambdy? bo chyba sie z tym nie spotkalem,

0

Możesz, i chyba o to chodzi.

0

No to mam cos takiego i dziala natomiast jak w sekcji catch mam zapisać żeby ten element przez ktory zostal wyrzucony wyjątek był pomijany i w jego miejsce został wylosowana nowa wartosc?

generate(A.begin(), A.end(), []()
	{	
		double gamma_val = rozkladGamma();
		try{
			if (gamma_val > 18.0){
				string exc = "Wartosc wieksza od 18";
				throw exc;
			}
		}
		catch (string mess)
		{
			cout <<mess<< endl;
			
		}
		return gamma_val;
	});
0

Pętla.

Nie jestem w 100% pewien czy o takie rozwiązanie chodzi, ale nic innego nie przychodzi mi do głowy.

0

Zawartość lambdy wrzuć do funkcji i w catch zwróć tą funkcję. Właściwie wtedy lambda nie będzie potrzebna.

0

Problem już rozwiązany :)

2

rozkladGamma jest źle robiony, bo generator tworzysz dla tylko jednej wartości więc w efekcie nadużywasz random device.
To powinno wyglądać tak:

std::random_device rd;
std::mt19937 gen(rd());
std::gamma_distribution<double> distribution(3.71, 1.0);

std::generate(A.begin(), A.end(), [&distribution, &gen]() { return distribution(gen); });
W3rter napisał(a):

W przypadku gdy wynik wartosć rozkladu bedzie wieksza niż 18.0 to ma zostać rzucony wyjątek.Obsługa wyjątku będzie polegać na wypisaniu w oknie konsoli że liczba jest wieksza od 18 i pominięciu tej liczby. Po obsłużeniu wyjątku program kontynuuje pobieranie kolejnych wartości z generatora i zapisywanie ich do kontenera A.

Zastanawiam się co autor zadania miał na myśli, bo biorąc to dosłownie wychodzi dość dziwny kod.
Treść wskazuje na coś w stylu coroutines, ale te mają być dostępne od C++20, a rzucanie wyjątku tylko po to, żeby go złapać w tym samym zakresie/funkcji jest bezsensu.

1 użytkowników online, w tym zalogowanych: 0, gości: 1