2009-03-12 17 views
5

Test için bazı verilerle bu kapları çok hızlı bir şekilde doldurmak istiyorum. Bunu yapmanın en iyi ve hızlı yolları nelerdir? Çok dolambaçlı ve böylece ve insanlık dışı kısa olmamalıdır, aynı zamanda seni memset bir altını dizi sahip olduğunu vektör knowning ile bir şeyler yapabiliriz düşüncestl fonksiyonlarını kullanarak vektör, harita ve set doldurmanın hızlı yolu

Düzenleme

Guys ayrıntılı için değil? Ayrıca haritaya ne dersiniz?

cevap

3

Zaten bir C stili dizisinde söylenen ilk veri var, bu STL konteynerler "2-iterator kurucuları" var unutmayın.

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

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

Düzenleme: Bir harita için bir örnek göstermek istendi. Sık sık etrafta yatan bir çiftler dizisi yok, ama geçmişte ham veri dosyasından çiftler dizisini oluşturan bir Python betiği yarattım. haritayı çağırarak, onlara üzerinde döngü can, anahtarların bir dizi varsa Alternatif

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

ve ve veri değerler dizisi: Daha sonra bu kod oluşturulan yapıyı # include ve bunun gibi onunla bir harita initalized. insert (make_pair (anahtar, değer));

Ayrıca memset ve vektör hakkında da soru soruyorsunuz.

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

şimdi, haritaya ne dersin? –

+0

Harita için bir örnek eklendi. –

5

std::fill veya std::generate'u kullanabilirsiniz.

+0

örneklerle lütfen ... :) –

+0

http: Ben vektörler yapıcı yoluyla tüm bunların elementler için bir başlangıç ​​değeri verilebilir, çünkü bir vektör başlatmak için memset kullanarak herhangi bir gerçek liyakat vardır sanmıyorum: //msdn.microsoft.com/en-us/library/kaxe2wy9.aspx http://msdn.microsoft.com/en-us/library/46h7chx6.aspx – Paul

12
  • boost atama kütüphane yolu ad boost kullanılarak (http://www.boost.org/doc/libs/1_38_0/libs/assign/doc/index.html)

    :: atamak;
    std :: vektör < int> v;
    v + = 1,2,3,4,5,6,7,8,9;

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

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

  • std :: üretmek veya std :: generate_n

  • std :: backinserter - bazen
1

ben veri ekleme için özel operatörleri kullanabilirsiniz yardımcı olacaktır: Eğer

#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, basit bir döngü için daha özlü bir iş yapar :) –