2009-03-12 4 views
5

Je veux remplir ces conteneurs assez rapidement avec quelques données pour les tests. Quelles sont les meilleures façons de le faire? Il ne devrait pas être trop compliqué, et donc et inhumainement court, mais aussi de ne pas bavardFaçon rapide de remplir le vecteur, la carte, et définir, en utilisant les fonctions stl

Modifier

Guys Je pensais que vous pouvez faire quelque chose avec memset knowning ce vecteur a un tableau soulignant? Aussi, qu'en est-il de la carte?

Répondre

3

Si vous Si les données initiales sont déjà présentes, disons dans un tableau de style C, n'oubliez pas que ces conteneurs STL ont des "constructeurs 2-itérateurs".

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

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

Modifier: On m'a demandé de montrer un exemple pour une carte. Ce n'est pas souvent que vous avez un tableau de paires, mais dans le passé, j'ai créé un script Python qui a généré le tableau de paires à partir d'un fichier de données brutes. Je #inclure alors cette structure code généré et initalized une carte avec comme ceci:

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

Alternativement, si vous avez un tableau de clés, et et tableau de valeurs de données, vous pouvez passer en boucle les appelant carte. insert (make_pair (clé, valeur));

Vous posez aussi des questions sur memset et vector. Je ne pense pas qu'il y ait un vrai mérite d'utiliser memset pour initialiser un vecteur, car les vecteurs peuvent donner une valeur initiale pour tous leurs éléments par le constructeur:

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

maintenant, qu'en est-il de la carte? –

+0

Ajout d'un exemple pour la carte. –

5

Vous pouvez utiliser std::fill ou std::generate.

+0

exemples vous plaît ... :) –

+0

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

12
  • boost chemin de la bibliothèque d'affectation (http://www.boost.org/doc/libs/1_38_0/libs/assign/doc/index.html)

    utilisant boost namespace :: attribuer;
    std :: vecteur < int> v;
    v + = 1,2,3,4,5,6,7,8,9;

    std :: carte < std :: string, int> m;
    insert (m) ("Bar", 1) ("Foo", 2); Le vecteur < int> v
    v + = 1, 2, repeat_fun (4, & rand), 4;

  • std :: générer ou std :: generate_n

  • std :: backinserter - parfois vous aidera
1

J'utiliser les opérateurs personnalisés pour insérer des données:

#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 simple pour boucle fera un travail plus succinct :) –