2011-01-25 14 views
6

क्या यह रन तेजी से करने और अभी भी वही काम करने का कोई तरीका है?मैं कैसे तेजी से cout बना सकते हैं?

#include <iostream> 

int box[80][20]; 

void drawbox() 
{ 
    for(int y = 0; y < 20; y++) 
    { 
     for(int x = 0; x < 80; x++) 
     { 
      std::cout << char(box[x][y]); 
     } 
    } 
} 

int main(int argc, char* argv[]) 
{ 
    drawbox(); 
    return(0); 
} 

आईडीई: DEV C++ || ओएस: विंडोज

+9

शायद है कि एक बार एक स्ट्रिंग और उत्पादन का निर्माण करने के लिए तेजी से हो, या एक बार प्रति बाहरी लूप, जो 20 * 80 = 1600 –

+4

@Marc B के बजाय 1 या 20 couts होगा: एक buffered I/O लाइब्रेरी आपके लिए इसका ख्याल रखना चाहिए। दुर्भाग्यवश, सी ++ iostreams दोनों बफरिंग और I/O पर कुत्ते धीमे हैं। उन प्रश्नों को देखें जिन्हें मैंने पूछा है कि क्या आप कुछ अच्छे बेंचमार्क देखना चाहते हैं कि वे कितने दुखी हैं। –

+0

@ बेन वोगेट - और यह वास्तव में निराशाजनक है। यदि वे अधिक सावधानी से डिजाइन किए गए थे तो वे सी की स्टडीओ लाइब्रेरी से तेज हो सकते थे। :-( – Omnifarious

उत्तर

4

के रूप में मार्क बी टिप्पणी में कहा, तेजी से पहले होना चाहिए एक स्ट्रिंग में उत्पादन डाल:

char box[20][81]; 

:

int box[80][20]; 

void drawbox() 
{ 
    std::string str = ""; 
    str.reserve(80 * 20); 

    for(int y = 0; y < 20; y++) 
    { 
     for(int x = 0; x < 80; x++) 
     { 
      str += char(box[x][y]); 
     } 
    } 

    std::cout << str << std::flush; 
} 
+12

ओह, उस स्ट्रिंग को प्रीलोकेट करें। 'std :: string' में' std :: vector' जैसे आवंटित आवंटन पैटर्न आवश्यक नहीं हैं। –

+0

@ बेन वोगेट: यदि आवश्यक हो तो मैं बहुत निराश हूं ... यह निश्चित रूप से कार्यान्वयन के मुद्दे की गुणवत्ता की तरह लगता है ... –

+2

@ मैथ्यूयू एम: मुझे संदेह है कि कोई भी डिफ़ॉल्ट स्ट्रिंग कार्यान्वयन 1600 बाइट्स को सुरक्षित रखता है। इस प्रकार यह संभवतः खत्म लेखन से पहले कई पुन: आवंटन होगा। आवश्यक स्थान पूर्व-आरक्षित करने के लिए बस एक अच्छा विचार है। –

1

ज़रूर, stdio.h से putchar का उपयोग करें।

+1

यह किसी भी तेजी से नहीं था – Mark

+0

@Mark:।? वास्तव में क्या आपको यकीन है कि यह अपने कार्यक्रम टोंटी है कि है और कंसोल विंडो नहीं? क्या आप जांच सकते हैं कि आउटपुट को फ़ाइल पर रीडायरेक्ट किया जाता है या नहीं? –

+0

यहां समस्या सी ++ बनाम सी का उपयोग नहीं कर रही है (और वास्तव में, उसके उदाहरण में यह cstdio से putchar() होगा)। मुद्दा हर चरित्र के लिए डेटा प्रिंट कर रहा है। – BjoernD

1

स्पष्ट समाधान box सरणी अलग ढंग से घोषित करने के लिए है फिर आप एक समय में cout एक पंक्ति कर सकते हैं। आप जो भी कारण के लिए ऐसा नहीं कर सकते हैं, तो यहाँ std :: स्ट्रिंग का उपयोग करने की आवश्यकता नहीं है - एक char सरणी तेजी से होता है:

char row[81] ; row[80] = 0 ; 
for (int y = 0; y < 20; y++) 
    { 
    for (int x = 0 ; x < 80 ; x++) 
    row[x] = char(box[x][y]) ; 
    std::cout << row ; 
    // Don't you want a newline here? 
    } 
+0

यही वह था जो मैं सोच रहा था। किसी भी सरणी को गतिशील रूप से आवंटित करने की आवश्यकता नहीं है जो हर बार एक ही आकार का होता है। – GManNickG

संबंधित मुद्दे