Torna indietro   Hardware Upgrade Forum > Software > Programmazione

DS N°7 E-Tense: il SUV premium made in Melfi che punta su autonomia e comfort
DS N°7 E-Tense: il SUV premium made in Melfi che punta su autonomia e comfort
Fino a 740 km WLTP con la batteria da 97,2 kWh, sospensioni che leggono la strada con una telecamera e un abitacolo da salotto parigino. La nuova DS N°7 raccoglie l'eredità della DS 7 e la porta, per la prima volta, nel mondo 100% elettrico. Ecco come è fatta, cosa offre e quanto costa.
Recensione Samsung Galaxy Tab S12 Ultra: non chiamatelo tablet... è molto di più
Recensione Samsung Galaxy Tab S12 Ultra: non chiamatelo tablet... è molto di più
Abbiamo provato Samsung Galaxy Tab S12 Ultra nella versione 12 GB + 256 GB con tastiera, e il risultato è un tablet che in questa configurazione si comporta come un notebook con la fluidità tipica di Android. Spessore di 5,1 mm, display Dynamic AMOLED 2X da 14,6 pollici, MediaTek Dimensity 9500 e un software senza incertezze compongono un prodotto di vertice, con prezzi da 1.539 euro, frenato solo da un'autonomia nella parte bassa del confronto
Hyundai IONIQ 5 N, l'elettrica che finge di essere termica (e ci riesce da paura)
Hyundai IONIQ 5 N, l'elettrica che finge di essere termica (e ci riesce da paura)
Abbiamo provato per dieci giorni la Hyundai IONIQ 5 N, con 650 CV, 770 Nm e uno 0-100 km/h in 3,4 secondi. Il suo punto forte è N e-Shift, che simula un cambio a otto rapporti con suoni da motore termico e perfino un bang supersonico
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 30-08-2015, 17:10   #1
fracarro
Senior Member
 
L'Avatar di fracarro
 
Iscritto dal: Jul 2002
Messaggi: 869
[C++] Ricerca binaria su vettore di puntatori a struct

Salve a tutti.
Come da titolo avrei bisogno di implementare una ricerca binaria (che restituisce un iteratore e non un valore bool) per un vettori di puntatori a struttura (dichiarato come std::vector<datiArco*> vetArchi; ). La struttura dati è la seguente:
Codice:
 struct datiArco{
   int da;
   int a;
   std::vector<int> colori;
   
   bool operator<(const datiArco &other) const {
      if(this->da == other.da) return this->a < other.a;
      else return this->da < other.da;
   }
   
   bool operator==(const datiArco &other) const {
          return ((this->da == other.da) && (this->a == other.a));
   }
 };

static bool comparePtrToArc(const datiArco* ptr1, const datiArco* ptr2) {
	if(ptr1->da == ptr2->da) return (ptr1->a < ptr2->a);
	else return (ptr1->da < ptr2->da);
}
La funzione comparePtrToArc serve per il sort del vettore (e fino qui tutto ok). Leggendo su internet mi sembra possibile implementare la ricerca binaria in c++ utilizzando la funzione lower_bound. Tuttavia quando invoco la funzione tramite il seguente comando:

Codice:
datiArco arcoTmp;
arcoTmp.da = i;
arcoTmp.a = j;
std::vector<datiArco*>::iterator itArco = std::lower_bound(getVetArchi().begin(), getVetArchi().end(), &arcoTmp,comparePtrToArc);
ricevo sempre una segmentation fault proprio nella riga di invocazione della funzione lower_bound. So che utilizzare un vettore di puntatori non è consigliato ma non posso cambiare questa struttura. Qualche esperto di c++ può darmi qualche consiglio per individuare l'errore?
__________________
Notebook: MBP 15 i7 Retina, (Mid 2014)
fracarro è offline   Rispondi citando il messaggio o parte di esso
Old 01-09-2015, 00:08   #2
71106
Bannato
 
Iscritto dal: Nov 2014
Messaggi: 292
Tre osservazioni:
  1. Non mi sembra di vedere nulla di sbagliato nei due snippet, l'errore potrebbe essere nella funzione getVetArchi().
  2. L'implementazione comparePtrToArc è identica a quella dell'operatore <, quindi puoi eliminare quella funzione e affidarti sempre all'uso implicito dell'operatore, sia nel sort che nella ricerca binaria.
  3. Se ti serve solo di testare la presenza dell'elemento, e non ti serve di avere l'iteratore, puoi usare binary_search.
71106 è offline   Rispondi citando il messaggio o parte di esso
Old 03-09-2015, 22:16   #3
fracarro
Senior Member
 
L'Avatar di fracarro
 
Iscritto dal: Jul 2002
Messaggi: 869
Quote:
Originariamente inviato da 71106 Guarda i messaggi
Tre osservazioni:
  1. Non mi sembra di vedere nulla di sbagliato nei due snippet, l'errore potrebbe essere nella funzione getVetArchi().
  2. L'implementazione comparePtrToArc è identica a quella dell'operatore <, quindi puoi eliminare quella funzione e affidarti sempre all'uso implicito dell'operatore, sia nel sort che nella ricerca binaria.
  3. Se ti serve solo di testare la presenza dell'elemento, e non ti serve di avere l'iteratore, puoi usare binary_search.
Innanzitutto grazie per le risposte. Riguardo i tre punti:
1. La funzione getVetArchi() è la seguente:
Codice:
   std::vector<datiArco*> getVetArchi() const {
      return vetArchi;
   }
ossia è il metodo "getter" di una classe X che contiene il vettore di struct vetArchi definito in questo modo: std::vector<datiArco*> vetArchi;

Nel primo post non avevo indicato questo dettaglio per non complicare la descrizione del problema ma la chiamate reale nel mio codice è:
Codice:
std::vector<datiArco*>::iterator itArco = std::lower_bound(p->getVetArchi().begin(), p->getVetArchi().end(), &arcoTmp,comparePtrToArc);
dove p è un oggetto della classe X.

2. Giusto, eliminerò la funzione inutile.

3. Purtroppo è proprio quello il problema. Tutta la questione nasce dalla necessità di avere l'iteratore o l'indice dell'elemento nell'array, non mi basta sapere se l'elemento è presente o meno.
__________________
Notebook: MBP 15 i7 Retina, (Mid 2014)
fracarro è offline   Rispondi citando il messaggio o parte di esso
Old 06-09-2015, 10:56   #4
71106
Bannato
 
Iscritto dal: Nov 2014
Messaggi: 292
Quote:
Originariamente inviato da fracarro Guarda i messaggi
Innanzitutto grazie per le risposte. Riguardo i tre punti:
1. La funzione getVetArchi() è la seguente:
Codice:
   std::vector<datiArco*> getVetArchi() const {
      return vetArchi;
   }
ossia è il metodo "getter" di una classe X che contiene il vettore di struct vetArchi definito in questo modo: std::vector<datiArco*> vetArchi;

Nel primo post non avevo indicato questo dettaglio per non complicare la descrizione del problema ma la chiamate reale nel mio codice è:
Codice:
std::vector<datiArco*>::iterator itArco = std::lower_bound(p->getVetArchi().begin(), p->getVetArchi().end(), &arcoTmp,comparePtrToArc);
dove p è un oggetto della classe X.
Ora è più chiaro: getVetArchi effettua una copia del vettore, e la invochi indipendentemente per ottenere l'iteratore di inizio e quello di fine, quindi i due iteratori tra i quali la lower_bound si trova ad iterare appartengono a due vettori diversi.

Prova così:

Codice:
std::vector<datiArco*> vetArchi = p->getVetArchi();
std::vector<datiArco*>::iterator itArco = std::lower_bound(vetArchi.begin(), vetArchi.end(), &arcoTmp,comparePtrToArc);
71106 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


DS N°7 E-Tense: il SUV premium made in Melfi che punta su autonomia e comfort DS N°7 E-Tense: il SUV premium made in Melfi...
Recensione Samsung Galaxy Tab S12 Ultra: non chiamatelo tablet... è molto di più Recensione Samsung Galaxy Tab S12 Ultra: non chi...
Hyundai IONIQ 5 N, l'elettrica che finge di essere termica (e ci riesce da paura) Hyundai IONIQ 5 N, l'elettrica che finge di esse...
CES Unveiled Milan, l'IA diventa tecnologia fondativa e il commercio torna centrale CES Unveiled Milan, l'IA diventa tecnologia fond...
 Recensione OPPO Find X10 Pro Max: un top di gamma completo con tre fotocamere da 200MP Recensione OPPO Find X10 Pro Max: un top di gam...
Google aggiorna la privacy: i dati di Gm...
Ubuntu Core Desktop torna in vita: anche...
Intel Moon Lake: le prime indiscrezioni ...
Motorola Signature 27 e Razr Flex: svela...
Il menu che tutti chiedevano da anni arr...
GitHub fa i conti con il boom dell'IA: a...
Samsung valuta due strade per Galaxy Z F...
Reddit sdoppia la home: arrivano i feed ...
NVIDIA apre Nemotron 3.5 Transcribe: 40 ...
Qwen3.8 27B dice di voler veder bruciare...
PS Plus Essential: svelati i tre giochi ...
Instagram fa sul serio e sfida YouTube: ...
Quanti token hai bruciato oggi? Per Amaz...
Gemini Notebook ascolta e trascrive: deb...
iPhone 18 Pro, vendite in crescita a liv...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 12:09.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v