Newsgroup: it.comp.lang.c++
Titolo: [IT?] Trovare elementi compresi in un certo intervallo con multiset/multimap/etc

Ciao NG,
Anzitutto scusate perché la domanda non è esattamente IT
ma c'è il solito fatto che alle volte è difficile separare
l'algoritmo dalla sua implementazione con funzioni di
libreria del linguaggio.
Ho una certa quantità di records (che possiedono la loro
chiave), e mi occorre di estrarre dalla struttura dati che
li contiene, tutti quelli compresi in un certo intervallo,
per giunta - come da subject - alla stessa chiave
potrebbero corrispondere più records. L'ordine di
grandezza del numero records è attorno al paio di migliaia
massimo e seppur la ricerca non è la mia "istruzione
dominante" l'accesso in tempo logaritmico non mi
dispiacerebbe.
Fin qui ho sempre usato solo "find" ma è la prima volta
che mi imbatto nella ricerca di records entro un certo
intervallo di chiave. Esiste qualche funzione membro
adatta o se no qualche modo di utilizzare la STL o altro?
grazie!
Apx.
-- 
"Papà, cos'è un mostro? - Mia cara, così su tre piedi
proprio non te lo saprei dire"

 adatta o se no qualche modo di utilizzare la STL o altro?
Ci sono di sicuro. Mi pare di ricordare che si chiamino "lowerbound" e 
"upperbound".
E.

 "lowerbound" e "upperbound".
sìììììììììì! Grazie ancora una volta, effettivamente solo
loro (underscore a parte)!
ciao!
C.


loro (underscore a parte)!
Mi pare siano iteratori al primo e all'ultimo elemento della sequenza di 
elementi con la stessa chiave.
Ciao 

 della sequenza di elementi con la stessa chiave.
sono loro, infatti... e meno male che qualcuno ha scritto
la STL, magica!


 "upperbound".
Ho trovato questo esempio:
#include <iostream>
#include <map>
using namespace std;
int main ()
{
  multimap<char,int> mymultimap;
  multimap<char,int>::iterator it,itlow,itup;
  mymultimap.insert(pair<char,int>('a',10));
  mymultimap.insert(pair<char,int>('b',121));
  mymultimap.insert(pair<char,int>('c',1001));
  mymultimap.insert(pair<char,int>('c',2002));
  mymultimap.insert(pair<char,int>('d',11011));
  mymultimap.insert(pair<char,int>('e',44));
  itlow=mymultimap.lower_bound ('b');  // itlow points to b
  itup=mymultimap.upper_bound ('d');   // itup points to e (not d)
  // print range [itlow,itup):
  for ( it=itlow ; it != itup; it++ )
    cout << (*it).first << " => " << (*it).second << endl;
  return 0;
}
Ma se volessi stampare dalla a alla prima c che istruzioni dovrei usare?
Ho provato:
itlow=mymultimap.lower_bound ('a');
itup=mymultimap.lower_bound ('c');
ma si ferma alla b. 

 ma si ferma alla b.
Abbastanza correttamente, mi pare. Il commento "// print range [itlow,
itup)" è abbastanza chiaro...
Poiché itup lo fai puntare a mymultimap.lower_bound ('c'), "c" è nella
map, e il ciclo che stampa gli elementi ha come condizione "it !=
itup", l'ultima stampa la hai con it->first < itup->first.
Devi aggiungere un "if (it != mymultimap.end ()) cout << [...] ;" dopo
il ciclo for.
Altrimenti, potresti pensare di selezionare itup =
mymyultimap.upper_bound ('c'+1). Non l'ho provato.
Ciao,
Matteo

mymyultimap.upper_bound ('c'+1). Non l'ho provato.
'c' + 1 fa cambiare totalmente il significato del codice, dato che va a 
cercare il valore 100, mentre se intendevi mymultimap.upper_bound ('c') + 1 
da errore dato che non � definito operator+.