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

Problem z funkcją find_if w c++

Object Storage Arubacloud
0 głosów
235 wizyt
pytanie zadane 18 stycznia 2017 w C i C++ przez heros22pt Użytkownik (950 p.)
edycja 18 stycznia 2017 przez heros22pt

Witam, mam problem z find_if. Wszystko wydaje mi się ok, ale niestety w trakcie kompilacji wywala mi błąd "no operatr "=" matches these operands" ...

kod wygląda następująco

#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;
//}
Dziecko dzieci_ktore_sa_blizej_niz_10(vector<Dziecko>&ListaDzieci)
{
	Dziecko itr;
	itr = find_if(ListaDzieci.begin(), ListaDzieci.end(), [](int x){return x < 10; });
	return itr;
}
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 dziecko_ponizej_10;
	dziecko_ponizej_10=dzieci_ktore_sa_blizej_niz_10(Lista_dzieci);
	system("pause");

}

cały program działa bez problemu, oprócz właśnie funkcji find_if. Ktoś może wie dla czego jest taki błąd? może źle to zwracam?

 

komentarz 18 stycznia 2017 przez criss Mędrzec (172,590 p.)
przywrócone 19 stycznia 2017 przez criss
W której linii wyrzuca błąd?
komentarz 18 stycznia 2017 przez heros22pt Użytkownik (950 p.)

 itr = find_if(ListaDzieci.begin(), ListaDzieci.end(), [](int x){return x < 10; });

Tu wyrzuca,

1 odpowiedź

+1 głos
odpowiedź 18 stycznia 2017 przez criss Mędrzec (172,590 p.)
wybrane 19 stycznia 2017 przez heros22pt
 
Najlepsza
Funkcja przekazana do find_if musi przyjmować typ obiektu dla którego zostanie wywołana... Czyli w tym przypadku Dziecko. Twoja lambda przyjmuje int.
komentarz 19 stycznia 2017 przez heros22pt Użytkownik (950 p.)

zamiast lambdy używam predykatu

bool predykat_do_find_if(Dziecko a)
{
	if (sqrt((a.x)*(a.x) + (a.y)*(a.y)) < 10)
	{
		return true;
	}
	else return false;
}
Dziecko dzieci_ktore_sa_blizej_niz_10(vector<Dziecko>&ListaDzieci)
{
	Dziecko itr;
	itr = find_if(ListaDzieci.begin(), ListaDzieci.end(), predykat_do_find_if);
	return itr;
}

rezultat ten sam

komentarz 19 stycznia 2017 przez criss Mędrzec (172,590 p.)
Podaj cały komunikat błędu. "these operands" czyli jakich operandów?
komentarz 19 stycznia 2017 przez heros22pt Użytkownik (950 p.)

1>------ Build started: Project: lab_11, Configuration: Debug Win32 ------
1>  main.cpp
1>c:\users\lenovo\desktop\politechnika\informatyka\zadaniac++\lab11\lab_11c++\lab_11\main.cpp(37): warning C4244: 'return' : conversion from 'double' to 'float', possible loss of data
1>c:\users\lenovo\desktop\politechnika\informatyka\zadaniac++\lab11\lab_11c++\lab_11\main.cpp(87): error C2679: binary '=' : no operator found which takes a right-hand operand of type 'std::_Vector_iterator<std::_Vector_val<std::_Simple_types<Dziecko>>>' (or there is no acceptable conversion)
1>          c:\users\lenovo\desktop\politechnika\informatyka\zadaniac++\lab11\lab_11c++\lab_11\main.cpp(16): could be 'Dziecko &Dziecko::operator =(const Dziecko &)'
1>          while trying to match the argument list '(Dziecko, std::_Vector_iterator<std::_Vector_val<std::_Simple_types<Dziecko>>>)'
1>c:\users\lenovo\desktop\politechnika\informatyka\zadaniac++\lab11\lab_11c++\lab_11\main.cpp(92): warning C4244: 'argument' : conversion from 'time_t' to 'unsigned int', possible loss of data
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

a error to:

 4 IntelliSense: no operator "=" matches these operands
            operand types are: Dziecko = std::_Vector_iterator<std::_Vector_val<std::_Simple_types<Dziecko>>> 

 

komentarz 19 stycznia 2017 przez criss Mędrzec (172,590 p.)

Uhh.. szukałem błędu gdzie indziej a oczywiście jest na wierzchu.

86 linia. Zadeklarowałeś itr jako Dziecko, a find_if zwraca iterator (tutaj std::vector<Dziecko>::iterator). Zmień typ na poprawny. A najlepiej po prostu użyj auto żeby nie było więcej takich niespodzianek:

    auto itr = find_if(ListaDzieci.begin(), ListaDzieci.end(), predykat_do_find_if);
    return *itr;

Btw. warto by było sprawdzać najpierw czy find_if cokolwiek znalazł zamiast od razu wyciągać obiekt z pod iteratora nie wiedząc czy w ogóle tam jest.

Po drugie: lepiej żeby twoja lambda przyjmowała referencje (najlepiej const) zamiast kopiować obiekt.

Podobne pytania

0 głosów
1 odpowiedź 195 wizyt
pytanie zadane 14 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ź 138 wizyt
pytanie zadane 20 stycznia 2017 w C i C++ przez heros22pt Użytkownik (950 p.)

92,540 zapytań

141,382 odpowiedzi

319,481 komentarzy

61,928 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!

...