Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826

    [c++]stl e function object

    Ciao.
    Ho un asta suddivisa in tanti elementi inseriti in un vector<double>(ogni elemento ha un valore double) e per ogni elemento devo vedere se l'elemento prima ha un valore minore o maggiore , se l'elemento prima ha un valore - dovro settare un + nell array di output se l'elemento prima ha un valore maggiore dovro settare un - nell array di output all indice dell elemento in quel punto sull' asta.
    Vorrei che mi fosse ritornato un vettore di + o - con indice ogni elemento(a 0 el. 1 a 1 el . 2 ec...)
    penso che una buona soluzione possa essere fatta coni function object.
    qualche dritta?
    grazie.

  2. #2
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Qualcosa del genere. (A te il compito di addattarlo).
    codice:
    #include <vector>
    #include <algorithm>
    
    struct cmp {
    	cmp(int c) : i(c) {}
    	int i;
    	
    	char operator()(int h) {
    		return (i<=h) ? '+' : '-';
    	}
    };
    
    int main() {
    	
    	int arr[10] = {1,3,5,7,9,4,2,8,10,11 };
    	vector<int> vin(arr, arr+10);
    	vector<char> vout(vin.size());
    	std::transform(vin.begin(),vin.end(),vout.begin(),cmp(5));
    }
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  3. #3
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826
    Originariamente inviato da shodan
    Qualcosa del genere. (A te il compito di addattarlo).
    codice:
    #include <vector>
    #include <algorithm>
    
    struct cmp {
    	cmp(int c) : i(c) {}
    	int i;
    	
    	char operator()(int h) {
    		return (i<=h) ? '+' : '-';
    	}
    };
    
    int main() {
    	
    	int arr[10] = {1,3,5,7,9,4,2,8,10,11 };
    	vector<int> vin(arr, arr+10);
    	vector<char> vout(vin.size());
    	std::transform(vin.begin(),vin.end(),vout.begin(),cmp(5));
    }
    grande shodan va perfettamente.
    grazie.

  4. #4
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826
    altro dubbio:
    se volessi confrontare il primo oggetto del container stl (il vector in questo caso) col secondo ,il secondo col terzo , il terzo col quarto e cosi via come faccio a fare arrivare i due oggetti al function object?
    un po come in un functore per il sort.
    scusa se scrivo delle castronerie ma mi sto documentando poco alla volta con thinking c++ (che è gratuito ma mi sembra fatto molto bene) e questa cosa non l'ho assimilata molto bene.
    Grazie.

  5. #5
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Ti riporto un esempio un pò più completo.
    La dimensione del vector destinatario dev'essere minore di una unità perché i confronti sono solo 9 (in questo caso) e l'ultimo elemento sarebbe sempre 0.
    In caso di dubbio, la versione con il back_inserter si occupa di dimensionare correttamente il vector destinatario.

    Attenzione al secondo e terzo parametro. E' corretto che siano così altrimenti nell'ultimo confronto si avrebbe un crash a causa di un iteratore invalido.

    Da notare che se l'oggetto funzione non prende parametri nel costruttore, può essere sostituito da una funzione inline (risparmiando la costruzione del l'oggetto temporaneo).

    codice:
    #include <vector>
    #include <iterator>
    #include <algorithm>
    
    struct cmp {
    	char operator()(int a, int b) {
    		return (a<=b) ? '+' : '-';
    	}
    };
    
    inline char fcmp (int a, int b) {
    	return (a<=b) ? '+' : '-';
    }
    
    int main() {
    
    	int arr[10] = {1,3,5,7,9,4,2,8,10,11 };
    	vector<int> vin(arr, arr+10);
    
    	vector<char> voutA(vin.size()-1);
    	std::transform(vin.begin(),vin.end()-1,vin.begin()+1, voutA.begin(),cmp() );
    
    	vector<char> voutB(vin.size()-1);
    	std::transform(vin.begin(),vin.end()-1,vin.begin()+1, voutB.begin(),fcmp);
    	
    	vector<char> voutC;
    	std::transform(vin.begin(),vin.end()-1,vin.begin()+1, back_inserter(voutC),fcmp);
    
    }
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.