2009-09-09 16 views
12

में वेक्टर में चार बफर संलग्न करना के अंत तक सी बफर ( char *) की सामग्री को जोड़ने का सही (और कुशल) तरीका क्या है? एसटीएल

std::vector<char> vec; 

const char* values="values"; 
const char* end = values + strlen(values); 

vec.insert(vec.end(), values, end); 

वेक्टर करने के लिए इसे दूसरों को सौंपना back_inserter का उपयोग करने को प्राथमिकता दी जानी चाहिए क्योंकि वेक्टर तो अपने अंतिम पर फैसला कर सकते हैं:

उत्तर

30

जब आप एक vector<char> उपलब्ध है, तो आप शायद सबसे अच्छा vector<char>::insert विधि बुला रहे हैं आकार। back_inserter केवल push_back होगा, संभवतः अधिक पुनर्वितरण का कारण बनता है।

4

मुझे लगता है कि उचित तरीके से किया जाएगा करने के लिए

vec.insert(vec.end(),buf,buf+length); 

या

std::copy(buf,buf+length,std::back_inserter(vec)); 

संपादित करें: मैं दो उदाहरण पुनर्क्रमित, तो यह है कि टिप्पणीकर्ताओं गलत हैं नहीं है, यह सिर्फ मुझे है ;-)

+0

जबकि पहला सही है, दूसरा यह बेहतर है, क्योंकि वेक्टर यह समझ सकता है कि इटरेटर यादृच्छिक-पहुंच वाले इटरेटर्स हैं और उन्हें पहले से आरक्षित करने के लिए उपयोग करते हैं, संभावित पुन: आवंटन को बचाते हैं। – sbi

+0

सच है। हालांकि, इससे ज्यादा उम्मीद नहीं होगी। वैसे भी, रोम के लिए एक से अधिक सड़कें हैं ;-) –

+0

मैं वास्तव में दूसरे को बेहतर होने की उम्मीद करता हूं, क्योंकि कई आधुनिक कार्यान्वयन अब सरल मामलों को अनुकूलित करते हैं। यह तीन तरीकों से सरल है: 'वेक्टर <>' एक साधारण टेम्पलेट है, 'char * 'एक साधारण इटरेटर है, और' char' एक साधारण पीओडी है। – MSalters

1

मैंने इसे संकलित नहीं किया है, लेकिन यह कुछ ऐसा होना चाहिए:

const char string1[] = "a string"; 
std::vector<char> vData; 
vData.insert(vData.end(), string1, string1+strlen(string1));