2009-03-12 7 views
5

Quiero llenar estos contenedores bastante rápido con algunos datos para probar. ¿Cuáles son las mejores y más rápidas formas de hacer eso? No debe ser demasiado complicado, y por lo tanto e inhumanamente corta, pero tampoco en modo detalladoForma rápida de llenar vector, mapa y establecer, usando funciones stl

Editar

chicos pensé que puede hacer algo con memset knowning que el vector tiene una gran variedad subrayando? Además, ¿qué pasa con el mapa?

Respuesta

3

Si Ya tiene los datos iniciales por los alrededores, por ejemplo, en una matriz de estilo C, no olvide que estos contenedores STL tienen "constructores de 2 iteradores".

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

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

Editar: Me pidieron que muestran un ejemplo de un mapa. No es frecuente que tenga una matriz de pares por ahí, pero en el pasado he creado una secuencia de comandos de Python que generó la matriz de pares de un archivo de datos sin formato. entonces #include esta estructura generada por código y initalized un mapa con él de esta manera:

#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); 

Alternativamente, si usted tiene una serie de teclas y y la matriz de valores de datos, puede recorrer más de ellos, llamando mapa. insert (make_pair (clave, valor));

También preguntas sobre memset y vector. Creo que no hay ningún mérito real de utilizar memset para inicializar un vector, vectores, porque se puede dar un valor inicial para todos sus elementos a través del constructor:

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

ahora, ¿qué tal el mapa? –

+0

Agregó un ejemplo para el mapa. –

5

Puede usar std::fill o std::generate.

+0

ejemplos por favor ... :) –

+0

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

12
  • impulso manera biblioteca de asignación (http://www.boost.org/doc/libs/1_38_0/libs/assign/doc/index.html)

    utilizando impulso espacio de nombres :: asignar;
    std :: vector < int> v;
    v + = 1,2,3,4,5,6,7,8,9;

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

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

  • std :: generar o std :: generate_n

  • std :: backinserter - a veces le ayudará a
1

usan los operadores personalizados para la inserción de los datos:

#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 bucle simple for hará un trabajo más sucinto :) –

Cuestiones relacionadas