Inizializza il vettore inline del bool
Domanda
Sto usando questo esempio per inizializzare il vettore BOOL:
#include <iostream>
#include <map>
#include <vector>
using namespace std;
int main() {
map<int, vector<bool> > myMap;
vector<bool> one {true, true, false};
myMap[2] = one;
cout << myMap[2][0] << endl;
cout << myMap[2][1] << endl;
cout << myMap[2][2] << endl;
return 0;
}
.
L'unico cambiamento che ho realizzato in questo codice utilizza std::vector
anziché vettoriale e ora ho:
std::map<int, std::vector<bool> > m_links;
std::vector<bool> m_allFalse {false, false, false, false, false};
.
Mi dice di utilizzare ;
dopo m_allFalse
.Come posso sbarazzarmi di questo errore?
Sto usando Intel Compiler 14, ma senza C ++ 11.
Soluzione
Problema è:
std::vector<bool> m_allFalse {false, false, false, false, false};
.
Sintassi errata in standard C ++.(forse in C ++ 11, non lo so)
È possibile utilizzare questa istanza:
std::vector<bool> m_allFalse(5, false); (*)
.
Se vuoi c ++ 11 modifica il tag e segui la punta @lakesh.
(*) Questo costruttore è spiegato in Vector Documentazione :
.(2) Il costruttore di riempimento costruisce un contenitore con N elementi.Ogni L'elemento è una copia della Val.
Per inizializzare i valori dei booleani generali all'inizio, è possibile utilizzare questo modo:
bool tempBool[] = { true, false, false, true };
std::vector<bool> variousBool ( tempBool, tempBool + sizeof(tempBool) / sizeof(bool) );
.
Sapendo questo, potresti creare la tua classe vettoriale, semplicemente ereditando dal vettore (se vuoi che tu possa usare il modello per estendere a tutti i tipi):
class PimpedVector : public std::vector<bool> {
public:
PimpedVector(const unsigned int& size, ...) {
va_list args;
va_start(args, size);
for ( size_t i = 0; i < size; ++i ) {
bool b = va_arg(args, bool);
this->push_back(b);
}
}
}
.
Quindi dal tuo principale puoi creare un pimpedvector in questo modo:
PimpedVector p0(5, true, false, false, true, false);
. Altri suggerimenti
La funzione che stai utilizzando è stata introdotta in C ++ 11. Dal momento che, come rivela la tua domanda, stai compilando come C ++ 98, il compilatore si lamenta giustamente a riguardo, perché non è valido C ++ 98 Sintassi.
Per il caso speciale di tutti i valori è lo stesso, il modo C ++ 98 (che lavora ancora in C ++ 11, e per questo caso speciale preferito anche lì) per inizializzare è, come menzionato da Velthune, .
std::vector<bool> m_allFalse(5, false);
.
In realtà poiché std::vector
predefinito-Inizializza tutti i suoi valori e false
è il valore predefinito di bool
, per quel caso specifico che puoi persino semplificarlo a
std::vector<bool> m_allFalse(5);
.
Se si desidera più valori generali, dovrai copiarli, ad esempio:
std::vector<bool> foo(3);
foo[0] = foo[1] = true;
foo[2] = false; // that line is actually not needed because of default initialization of members
.
o
std::vector<bool> foo;
foo.push_back(true);
foo.push_back(true);
foo.push_back(false); // this time, it is needed because it actually created the thirs argument
.
Una nota aggiuntiva: noto il prefisso m_
del tuo nome della variabile; Ciò suggerisce che stai dichiarando una variabile (se sì, è un dettaglio cruciale che hai lasciato fuori). Una variabile membro non può (in c ++ 98) viene data un inizializzatore (di qualsiasi tipo) alla sua dichiarazione (ad eccezione dei membri const statici del tipo intero). Per le variabili dei membri non statiche, è necessario inizializzarli nella chiamata del costruttore, ad esempio:
class X
{
public:
X(); // the constructor
private:
std::vector<bool> m_Foo;
};
// constructor definition follows
X::X():
m_Foo(5, false) // this initializes your member variable `m_Foo`
{
}
.