• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

find_if c++, jak skorzystać

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
0 głosów
309 wizyt
pytanie zadane 14 stycznia 2017 w C i C++ przez heros22pt Użytkownik (950 p.)

Witam, mam problem, ponieważ nie mogę nigdzie znaleźć dobrego przykładu, jak używać funkcji find_if w c++. Za pomocą tej funkcji mam znaleźć osobe/osoby oddalone od pkt. o maksymalnie 10 jednostek... Problem leży tylko w umiejętności korzystania z tej funkcji, której niestety nie posiadam. Mógłby ktoś pomóc?

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

struct Dziecko
{
	string nazwisko;
	string imie;
	int x;
	int y;
};
string losuj_imie(string losowe_imie)
{	
	for (int i = 0; i < 6; ++i)
	{
		losowe_imie[i] = rand() % ('Z' - 'A') + 'A';
	}
	return losowe_imie;
}
void wyswietl_liste(vector<Dziecko> Lista)
{
	for (int i = 0; i < 5; ++i)
	{
		cout << Lista[i].nazwisko << "  -  ";
		cout << Lista[i].imie << "  -  ";
		cout << Lista[i].x << "  -  ";
		cout << Lista[i].y << endl;
	}
}
float odleglosc(int x, int y)
{
	return sqrt(x*x + y*y);
}
bool czy_dalej(Dziecko &a, Dziecko &b)
{
	float odl1, odl2;
	odl1=odleglosc(a.x, a.y);
	odl2 = odleglosc(b.x, b.y);

	if (odl1 < odl2)
		return true;
	else
		return false;
}

bool ktore_nazwisko_pierwsze_wg_alfabetu(Dziecko &a, Dziecko &b)
{
	if (a.nazwisko<b.nazwisko)
	{
		return true;
	}
	else
	{
		if (a.nazwisko == b.nazwisko)
		{
			if (a.imie < b.imie)
			{
				return true;
			}
			else return false;
		}
		else return false;
	}
		//return false;
}
void sortuj_wg_alfabetu(vector<Dziecko> &lista)
{
	sort(lista.begin(), lista.end(), ktore_nazwisko_pierwsze_wg_alfabetu);

}
bool predykat_do_find_if(Dziecko a)
{
	if (sqrt((a.x)*(a.x) + (a.y)*(a.y)) < 10)
	{
		return true;
	}
	else return false;
}
void dzieci_ktore_sa_blizej_niz_10(vector<Dziecko>&ListaDzieci)
{
	vector<Dziecko>::iterator ThisIt = {};
	ThisIt=find_if(ListaDzieci.begin(), ListaDzieci.end(), predykat_do_find_if);
	cout<< *ThisIt;
}
int main()
{
	srand(time(NULL));
	string imieD="      ";
	vector<Dziecko> Lista_dzieci;
	Dziecko testowa_zmienna;
	for (int i = 0; i < 5; ++i)
	{
		testowa_zmienna.imie = losuj_imie(imieD);
		testowa_zmienna.nazwisko = losuj_imie(imieD);
		testowa_zmienna.x = rand() % 20;
		testowa_zmienna.y = rand() % 20;

		Lista_dzieci.push_back(testowa_zmienna);
	}
	wyswietl_liste(Lista_dzieci);
	sort(Lista_dzieci.begin(), Lista_dzieci.end(), czy_dalej);
	cout << endl << "Po Posortowaniu wzgledem odleglosci: " << endl;
	wyswietl_liste(Lista_dzieci);

	//zadanie a
	sortuj_wg_alfabetu(Lista_dzieci);

	cout << endl << "Po Posortowaniu wzgledem nazwiska i imienia: " << endl;
	wyswietl_liste(Lista_dzieci);

	//zadanie b
	vector<Dziecko> dziecko{};
	dziecko.push_back(dzieci_ktore_sa_blizej_niz_10(Lista_dzieci));
	system("pause");

}

W funkcji main chodzi o moment gdzie zakomentowałem //zadanie b

Próbowałem na różne sposoby, ale niestety...

komentarz 15 stycznia 2017 przez criss Mędrzec (172,570 p.)

Tak jak napisał adrian, find_if znajduje pojedynczy element (pierwszy na który natrafi dla którego predykat zwróci true), więc znajdziesz co najwyżej osobe, nie osoby.

Poza tym warto by było sprawdzać czy find_if cokolwiek znalazło (ThisIt != ListaDzieci.end()).

No i tak jak też wypomniał adrian - funkcja dzieci_ktore_sa_blizej_niz_10 została zadeklarowana jako zwracająca void (nic nie zwraca), więc linia dziecko.push_back(dzieci_ktore_sa_blizej_niz_10(Lista_dzieci)); nie ma sensu.

1 odpowiedź

0 głosów
odpowiedź 15 stycznia 2017 przez adrian17 Mentor (354,120 p.)

Ale nie powiedziałeś co nie działa.

W każdym razie z tego co widzę po kompilacji:

cout<< *ThisIt;

Dziecko nie ma zdefiniowanego operatora działającego z cout.

dziecko.push_back(dzieci_ktore_sa_blizej_niz_10(Lista_dzieci));

Funkcja dzieci_ktore_sa_blizej_niz_10 jest zdefiniowana jako void.

Za pomocą tej funkcji mam znaleźć osobe/osoby

find_id znajduje pojedynczy element, nie zbiór.

komentarz 15 stycznia 2017 przez heros22pt Użytkownik (950 p.)
ok, Dzięki za informację, jednakże mój problem polega na tym, że nie wiem jak na tym przykładzie poprawnie użyć funkcji found_if. Próbowałem na różne sposoby. Funkcje dzieci_ktore ... robiłem jako void, vector, Osoba (struktura) i tak dalej. próbowałem zwracać to nawet funkcją return *this, jednakże nie działa... Nie mam pomysłu jak napisać poprawnie tą funkcję, ponieważ dostaliśmy po prostu na studiach zadanie .. skorzystaj z found_if bez wcześniejszego objaśnienia jak to się robi, czy korzysta się ze wskaźników, czy jak...
komentarz 15 stycznia 2017 przez ElMago Początkujący (280 p.)
https://youtu.be/eV7tVdNIw9o?t=7m6s

W tym wideo masz dość jasno objaśnione jak korzystać z algorytmu find_if().

Podobne pytania

0 głosów
1 odpowiedź 386 wizyt
pytanie zadane 18 stycznia 2017 w C i C++ przez heros22pt Użytkownik (950 p.)
0 głosów
1 odpowiedź 168 wizyt
pytanie zadane 1 kwietnia 2017 w C i C++ przez krzakurts Obywatel (1,470 p.)
0 głosów
1 odpowiedź 223 wizyt
pytanie zadane 20 stycznia 2017 w C i C++ przez heros22pt Użytkownik (950 p.)

93,439 zapytań

142,431 odpowiedzi

322,677 komentarzy

62,802 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

...