2009-03-12 6 views
5

Voglio riempire questi contenitori abbastanza rapidamente con alcuni dati per il test. Quali sono i modi migliori e veloci per farlo? Non dovrebbe essere troppo complicata, e quindi e disumanamente breve, ma anche di non verboseModo rapido per riempire il vettore, mappare e impostare, usando le funzioni stl

Modifica

Ragazzi ho pensato che si può fare qualcosa con memset knowning quel vettore ha una serie sottolineando? Inoltre, che dire della mappa?

risposta

3

Se i dati iniziali sono già disposti intorno, ad esempio in un array in stile C, non dimenticare che questi contenitori STL hanno "costruttori a 2 iteratori".

const char raw_data[100] = { ... }; 

std::vector<char> v(raw_data, raw_data + 100); 

Edit: Mi è stato chiesto di mostrare un esempio per una mappa. Spesso non si dispone di una serie di coppie in giro, ma in passato ho creato uno script Python che ha generato l'array di coppie da un file di dati non elaborati. Ho poi # include tale struttura in codice generato e initalized una mappa con in questo modo:

#include <map> 
#include <string> 
#include <utility> 

using namespace std; 

typedef map<string, int> MyMap; 

// this array may have been generated from a script, for example: 
const MyMap::value_type raw_data[2] = { 
    MyMap::value_type("hello", 42), 
    MyMap::value_type("world", 88), 
}; 

MyMap my_map(raw_data, raw_data + 2); 

In alternativa, se si dispone di una serie di chiavi, e e matrice di valori di dati, è possibile effettuare il ciclo su di loro, chiamando mappa. inserire (make_pair (chiave, valore));

Chiedi anche su memset e vettore. Non credo che ci sia alcun vero merito all'utilizzo di memset per inizializzare un vettore, in quanto vettori possono essere dato un valore iniziale per tutti i loro elementi tramite il costruttore:

vector<int> v2(100, 42); // 100 ints all with the value of 42 
vector<string> v(42, "initial value"); // 42 copies of "initial value" 
+0

ora, che ne dici di mappa? –

+0

Aggiunto un esempio per la mappa. –

5

È possibile utilizzare std::fill o std::generate.

+0

esempi per favore ... :) –

+0

http: //msdn.microsoft.com/en-us/library/kaxe2wy9.aspx http://msdn.microsoft.com/en-us/library/46h7chx6.aspx – Paul

12
  • spinta modo biblioteca assegnazione (http://www.boost.org/doc/libs/1_38_0/libs/assign/doc/index.html)

    usare il boost :: namespace assegnare;
    std :: vector < int> v;
    v + = 1,2,3,4,5,6,7,8,9;

    std :: map < std :: string, int> m;
    insert (m) ("Bar", 1) ("Foo", 2);

    vector < int> v;
    v + = 1, 2, repeat_fun (4, & rand), 4;

  • std :: generare o std :: generate_n

  • std :: backinserter - a volte vi aiuterà a
1

io uso gli operatori personalizzati per l'inserimento dei dati:

#include <vector> 
#include <iostream> 
#include <string> 

using namespace std; 

template <class T> 
vector<T>& operator<<(vector<T>& vec, const T& x) { 
    vec.push_back(x); 
    return vec; 
} 

vector<string>& operator<<(vector<string>& vec, char* cstr) { 
    string s(cstr); 
    vec.push_back(s); 
    return vec; 
} 

int main() { 
    vector<int> foo; 
    vector<string> bar; 
    foo << 7 << 8 << 9 << 10; 
    bar << "foo" << "bar" << "baz"; 
} 
+0

argh, un ciclo for semplice eseguirà un lavoro più succinto :) –

Problemi correlati