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

find_if c++, jak skorzystać

Object Storage Arubacloud
0 głosów
197 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,590 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 Ekspert (344,860 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ź 241 wizyt
pytanie zadane 18 stycznia 2017 w C i C++ przez heros22pt Użytkownik (950 p.)
0 głosów
1 odpowiedź 118 wizyt
pytanie zadane 1 kwietnia 2017 w C i C++ przez krzakurts Obywatel (1,470 p.)
0 głosów
1 odpowiedź 141 wizyt
pytanie zadane 20 stycznia 2017 w C i C++ przez heros22pt Użytkownik (950 p.)

92,552 zapytań

141,399 odpowiedzi

319,534 komentarzy

61,938 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...