2009-03-12 23 views
5

का उपयोग करके वेक्टर, मानचित्र और सेट को भरने का त्वरित तरीका परीक्षण के लिए कुछ डेटा के साथ मैं इन कंटेनरों को बहुत तेज़ी से भरना चाहता हूं। ऐसा करने के लिए सबसे अच्छे और त्वरित तरीके क्या हैं? यह बहुत जटिल है और इस प्रकार और अमानवीय कम नहीं होना चाहिए, लेकिन यह भी नहीं वर्बोस कोएसटीएल फ़ंक्शंस

संपादित

दोस्तों मैंने सोचा कि आप memset कि वेक्टर knowning एक रेखांकित सरणी के साथ कुछ कर सकते हैं? इसके अलावा, मानचित्र के बारे में क्या?

उत्तर

3

सी स्टाइल सरणी में कहें कि पहले से प्रारंभिक डेटा बिछा रहा है, यह न भूलें कि इन एसटीएल कंटेनरों में "2-इटरेटर कन्स्ट्रक्टर" हैं।

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

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

संपादित: मैं एक नक्शा के लिए एक उदाहरण दिखाने के लिए कहा गया था। यह अक्सर आपके पास चारों ओर जोड़े जोड़े की एक सरणी नहीं होती है, लेकिन अतीत में मैंने एक पायथन स्क्रिप्ट बनाई है जो कच्चे डेटा फ़ाइल से जोड़े की सरणी उत्पन्न करती है। मैं तो इस कोड जेनरेट की गई संरचना # शामिल है और इस तरह यह के साथ एक नक्शा initalized: वैकल्पिक रूप से

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

अगर आप चाबियों का एक सरणी है, और और डेटा मानों की सरणी, आप उन पर पाश कर सकते हैं, नक्शे बुला। डालें (make_pair (कुंजी, मान));

आप मेमसेट और वेक्टर के बारे में भी पूछते हैं। मुझे नहीं लगता कि memset का उपयोग कर एक सदिश प्रारंभ करने के लिए किसी भी असली योग्यता नहीं है, क्योंकि वैक्टर निर्माता के माध्यम से अपने सभी तत्वों के लिए एक प्रारंभिक मूल्य दिया जा सकता है है:

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

अब, मानचित्र के बारे में कैसे? –

+0

मानचित्र के लिए एक उदाहरण जोड़ा गया। –

5

आप std::fill या std::generate उपयोग कर सकते हैं।

+0

उदाहरण कृपया ... :) –

+0

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

12
  • बढ़ावा काम पुस्तकालय रास्ता (http://www.boost.org/doc/libs/1_38_0/libs/assign/doc/index.html)

    नाम स्थान बढ़ावा का उपयोग कर :: आवंटित;
    std :: वेक्टर < int> v;
    v + = 1,2,3,4,5,6,7,8,9;

    std :: नक्शा < std :: स्ट्रिंग, पूर्णांक> मीटर;
    डालने (एम) ("बार", 1) ("फू", 2);

    वेक्टर < int> v;
    v + = 1, 2, repeat_fun (4, & रैंड), 4;

  • std :: उत्पन्न या std :: generate_n

  • std :: backinserter - कभी कभी आप
1

मैं डेटा डालने के लिए कस्टम ऑपरेटरों का उपयोग करने में मदद करेगा: यदि आप

#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

अरे, पाश के लिए एक सरल एक और अधिक संक्षिप्त काम करेगा :) –