Wyrażenie lambda C++

0

Zad. 1
Napisz wyrażenie lambda które będzie w podanym wektorze wejściowym umieszczało wartości odwrotne do początkowych. Wektor ma mieć długość podaną przez użytkownika i wartości losowe z przedziału podanego przez użytkownika.

Nie za bardzo wiem jak stworzyć wektor z podaną długością? Z resztą powinnam sobie poradzić.

2

std::vector<T> wektor_n_elementów(n) będzie n elementowym wektorem typu T. wektor_k_elementów.resize(n) zostanie zmniejszony/zwiększony do n elementów.

0

Na razie chciałam stworzyć wektor wejściowy o podanym rozmierze i umieścić w nim wartości losowe z podanego przedziału, ale coś nie działa?

#include <iostream>
#include <vector>
#include <ctime>
using namespace std;

int main()
{
	srand(time(NULL));
    int rozmiar;
	int a;
	int b;
    std::cout << "Podaj rozmiar wektora\n";
    std::cin >> rozmiar;

	std::cout << "Podaj poczatek przedzialu liczb\n";
	std::cin >> a;

	std::cout << "Podaj koniec przedzialu liczb\n";
	std::cin >> b;

	b = b - a + 1;

	std::vector<int> wektor(rozmiar);

	for (int i = 0; rozmiar; i++) {
		wektor(i) = (std::rand() % b) + a;
	}
}

0
  1. Co Ci nie działa?
  2. Używaj <random> jak człowiek współczesny.
  3. Możesz normalnie użyć for (auto &x: wektor) jako pętli; a jak masz chociaż C++17, to generate_n będzie bardziej eleganckie.
0

już wiem, że częścią problemu był zły nawias przy wektor[i], ale dalej wyskakuje mi błąd "vector subscript out of range"?

przepraszam, ale nie wiem za bardzo jak uzywać <random> a piszę tak jak nas uczono.

2
for (int i = 0; rozmiar; i++) {

Zmienna 'i' wylatuje w powietrze, bo masz nieprawidłowy warunek zakończenia pętli.
i < rozmiar - rozwiąże problem lub użycie rozwiązania z posta wyżej :

for (auto &x: wektor)

tylko zmieni się ciało pętli.

0

teraz działa : D

nie wiem jednak do końca jak napisać tą lambdę. Próbuje tak

auto l = [](vector<int>) {
		for (int i = 0; i < rozmiar; i++) {
			wektor[i] = 1 / wektor[i];
		}
		return wektor;
	};

ale nwm czy to ma sens.

2

Liczby odwrotne np.:
1 ==> 1
2 ==> 0.5
4 ==> 0.25

Ja coś czuję że do vector<int> będzie ciężko zapisać liczbę odwrotną ;)

0
Sway22 napisał(a):

teraz działa : D

nie wiem jednak do końca jak napisać tą lambdę. Próbuje tak

auto l = [](vector<int>) {
		for (int i = 0; i < rozmiar; i++) {
			wektor[i] = 1 / wektor[i];
		}
		return wektor;
	};

ale nwm czy to ma sens.

Nie ma to sensu, wybuchnie jak wektor[i] będzie Ziobrą.

2
std::transform(v.begin(), v.end(), v.begin(), <tu wchodzi wyrażenie lambda>);
0
Marius.Maximus napisał(a):

Liczby odwrotne np.:
1 ==> 1
2 ==> 0.5
4 ==> 0.25

Ja coś czuję że do vector<int> będzie ciężko zapisać liczbę odwrotną ;)

rzeczywiscie xD czyli zmieniam na vector<double>.

MarekR22 napisał(a):
std::transform(v.begin(), v.end(), v.begin(), <tu wchodzi wyrażenie lambda>);

nie za bardzo rozumiem. std::transform w ogóle nie dziala, a wyrazenie lambda mam wstawic takie jakie pisalam?

0

wyskauje dużo błędów xD
i nie za bardzo wiem jak to naprawic, bo nie rozumiem jak to ma działac?

#include <iostream>
#include <vector>
#include <ctime>
#include <algorithm>
using namespace std;

int main()
{

	srand(time(NULL));
	int rozmiar;
	int a;
	int b;
	std::cout << "Podaj rozmiar wektora\n";
	std::cin >> rozmiar;

	std::cout << "Podaj poczatek przedzialu liczb\n";
	std::cin >> a;

	std::cout << "Podaj koniec przedzialu liczb\n";
	std::cin >> b;

	b = b - a + 1;

	vector<double>wektor(rozmiar);

	for (int i = 0; i < rozmiar; i++) {
		wektor[i] = (std::rand() % b) + a;
	}

	for (int i = 0; i < wektor.size(); ++i) {
		std::cout << wektor[i] << ' ';
	}

	std::transform(wektor.begin(), wektor.end(), wektor.begin(), auto l = [](vector<double>) {
		for (int i = 0; i < rozmiar; i++) {
			wektor[i] = 1 / wektor[i];
		}
		return wektor;
		};);

	for (int i = 0; i < wektor.size(); ++i) {
		std::cout << wektor[i] << ' ';
	}

	return 0;
}

0

Tu masz przykład bez lambda na transform: https://godbolt.org/z/GPdaa786s, spróbuj zastąpić Inverse za pomocą lambdy.

Bez czegoś na wzór transform lambda nie ma sensu w twoim zadaniu.

0

@Sway22

	std::transform(wektor.begin(), wektor.end(), wektor.begin(), [](auto item){
    		return 1 / item;
	});

Błędy poza tym mogą także wynikać z tego, że kompilujesz w standardzie < 17

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.