• 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++

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
0 głosów
386 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,570 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,570 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,570 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,570 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ź 309 wizyt
pytanie zadane 14 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,676 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

...