2015-11-08 6 views
5

sto usando Visual Studio 2010 Pro su una macchina Windows 7 64bit e voglio usare count (dalla testata <algorithm>) su un valarray:Qual è il tipo di ritorno dell'algoritmo STL "contano", su un valarray

int main() 
{ 

    valarray<bool> v(false,10); 
    for (int i(0);i<10;i+=3) 
     v[i]=true; 

    cout << count(&v[0],&v[10],true) << endl; 

    // how to define the return type of count properly? 
    // some_type Num=count(&v[0],&v[10],true); 
} 

l'uscita del programma di cui sopra è corretto:

4 

Tuttavia voglio assegnare il valore a una variabile e utilizzando int risultati in avvisi del compilatore circa perdita di precisione. Poiché valarray non ha iteratori, non riesco a capire come utilizzare lo iterartor::difference_type.

È in qualche modo possibile?

+0

Si prega di chiarire. Vuoi assegnare l'output alla stessa variabile? Bene, immagino 'int x = count (& v [0], & v [10], vero);' non è quello che stai cercando? Altrimenti, che altro intendi esattamente? –

+0

Bene, count() restituisce uno std :: iterator_traits <_Iter> :: difference_type. Il casting su int è considerato come un comportamento definito? per int c = count (& v [0], & v [10], true); Sto ricevendo avviso del compilatore - possibile perdita di dati. –

+0

Potete permettervi l'aggiornamento a un compilatore C++ 11? C++ 11 ha sistemato molte cose per 'valarray', tra cui fornendole iteratori. –

risposta

2

Il tipo corretto per Num sarebbe:

typename iterator_traits<bool*>::difference_type 
    Num=count(&v[0],&v[10],true); 

La ragione di questo è che count ritorna sempre:

typename iterator_traits<InputIt>::difference_type 

e la tua InputIt è un puntatore a bool:

&v[0]; // is of type bool* 
&v[10]; // is of type bool* 

Per me iterator_traits<bool*>::difference_type valutazione ES per long così si potrebbe anche ottenere via con semplicemente usando:

long Num=count(&v[0],&v[10],true); 

Tuttavia devo ammettere che non ho la prova sotto Visual Studio 2010 Pro esplicitamente.

Problemi correlati