Pagina 1 di 1

[Risolto] [C++] Funzione find su un vettore di tipo generico

Inviato: domenica 15 giugno 2014, 15:09
da edoz90
Ciao a tutti!!
Devo creare una funzione che controlli la presenza di una City c in vector<City> tour.

Ho provato a fare:

Codice: Seleziona tutto

bool Tour::containsCity(City c) {
    std::vector<City>::iterator iter = std::find_if(this->tour.begin(), this->tour.end(), c);
    size_t index = std::distance(this->tour.begin(), iter);
    if (index == this->tour.size()) {
        return false;
    }else {
        return true;
    }
}
ma mi restituisce questo errore:

Codice: Seleziona tutto

g++    -c -g -MMD -MP -MF "build/Debug/GNU-Linux-x86/Tour.o.d" -o build/Debug/GNU-Linux-x86/Tour.o Tour.cpp
/usr/include/c++/4.9.0/bits/predefined_ops.h: In instantiation of ‘bool __gnu_cxx::__ops::_Iter_pred<_Predicate>::operator()(_Iterator) [with _Iterator = __gnu_cxx::__normal_iterator<City*, std::vector<City> >; _Predicate = City]’:
/usr/include/c++/4.9.0/bits/stl_algo.h:120:22:   required from ‘_RandomAccessIterator std::__find_if(_RandomAccessIterator, _RandomAccessIterator, _Predicate, std::random_access_iterator_tag) [with _RandomAccessIterator = __gnu_cxx::__normal_iterator<City*, std::vector<City> >; _Predicate = __gnu_cxx::__ops::_Iter_pred<City>]’
/usr/include/c++/4.9.0/bits/stl_algo.h:162:43:   required from ‘_Iterator std::__find_if(_Iterator, _Iterator, _Predicate) [with _Iterator = __gnu_cxx::__normal_iterator<City*, std::vector<City> >; _Predicate = __gnu_cxx::__ops::_Iter_pred<City>]’
/usr/include/c++/4.9.0/bits/stl_algo.h:3804:45:   required from ‘_IIter std::find_if(_IIter, _IIter, _Predicate) [with _IIter = __gnu_cxx::__normal_iterator<City*, std::vector<City> >; _Predicate = City]’
Tour.cpp:64:92:   required from here
/usr/include/c++/4.9.0/bits/predefined_ops.h:231:30: error: no match for call to ‘(City) (City&)’
  { return bool(_M_pred(*__it)); }
Come posso fare?

Grazie :ciao:

Re: [c++] Funzione find su un vettore di tipo generico

Inviato: domenica 15 giugno 2014, 15:40
da 1001001
Ciao! Potresti postare anche l'implementazione della classe City per favore?

Re: [c++] Funzione find su un vettore di tipo generico

Inviato: domenica 15 giugno 2014, 21:18
da edoz90
Ciao! scusa per il ritardo....
alla fine ho capito che era più veloce fare un ciclo for sul vector e controllare se a == b con un overloading dell'operatore ==

Codice: Seleziona tutto

bool Tour::containsCity(City c) {
    bool found = false;
    for (int i = 0; i < this->tour.size(); i++) {
        if (this->tour[i] == c) 
            found = true;
    }
    return found;
}

Codice: Seleziona tutto

bool City::operator == (City c) {
	return (this->id == c.id);
}

Re: [c++] Funzione find su un vettore di tipo generico

Inviato: domenica 15 giugno 2014, 23:35
da 1001001
Ok, se hai risolto ricordati di aggiungere [Risolto] al titolo del primo messaggio per favore :)

Ciao! :ciao:

Re: [RISOLTO][c++] Funzione find su un vettore di tipo gener

Inviato: lunedì 16 giugno 2014, 1:36
da edoz90
Dimenticavo....:D

Re: [RISOLTO][c++] Funzione find su un vettore di tipo gener

Inviato: lunedì 16 giugno 2014, 13:47
da ixamit
edoz90 ha scritto:bool Tour::containsCity(City c) {
    bool found = false;
    for (int i = 0; i < this->tour.size(); i++) {
        if (this->tour == c)
            found = true;
    }
    return found;
}

Non per essere pedante, ma il test dovrebbe contenere un ... && !found
EDIT: poco chiaro, ma credo sia ovvio... per il test intendo quello della for non quello della if