2009-12-31 17 views
20

मैं Accelerated C++ पढ़ रहा हूं और मुझे कहना है कि यह एक दिलचस्प किताब है।तारों के एक वेक्टर का मिश्रण

अध्याय 6 में, मैं एक ही स्ट्रिंग में एक सदिश < स्ट्रिंग > से श्रेणीबद्ध करने के लिए < एल्गोरिथ्म > से एक समारोह का उपयोग करने के लिए है। मैं जमा कर सकता था, लेकिन यह मदद नहीं करता है क्योंकि स्ट्रिंग कंटेनर केवल push_back अक्षर ही कर सकते हैं।

int main() { 
    using namespace std; 
    string str = "Hello, world!"; 
    vector<string> vec (10, str); 
    // Concatenate here? 

    return 0; 
} 

मैं तारों को एक साथ कैसे जोड़ूं?

+0

आप क्या पूछ रहे हैं? – tster

उत्तर

48

, ऐसा नहीं कहता है आप का उपयोग करने के लिए है जमा करें - यह "लाइब्रेरी एल्गोरिदम" का उपयोग करता है। हालांकि, अगर आप जमा का उपयोग कर सकते हैं:

#include <numeric> 

int main() { 
    string str = "Hello World!"; 
    vector<string> vec(10,str); 
    string a = accumulate(vec.begin(), vec.end(), string("")); 
    cout << a << endl; 
} 

सब जमा करता है दूसरा पैरामीटर के लिए पहले पैरामीटर से मूल्यों 'वैल' सभी के लिए तीसरे पैरामीटर के लिए 'योग' सेट कर दिया जाता है, और फिर, कार्य करें:

sum = sum + val 

फिर यह 'योग' देता है। इस तथ्य के बावजूद कि <numeric> में संचित घोषित किया गया है, यह operator+()

+0

धन्यवाद देता है धन्यवाद, मैंने 3 पैरामीटर के साथ एबीबीन के रूप में जमा करने का प्रयास करने का प्रयास किया, काम नहीं किया, मैंने बैक_इन्सेटर के साथ भी कोशिश की जो असफल रहा। क्या आप समझा सकते हैं कि यह कैसे काम करता है? बहुत बहुत धन्यवाद। – Bogdan

+1

यह प्रत्येक तत्व को वेक्टर में .begin() से .end() तक ले जाता है और उन्हें तीसरे पैरामीटर में जमा करता है, जो एक खाली std :: स्ट्रिंग अस्थायी रूप में पारित होता है। std :: acumulate() का वापसी मूल्य मूल्य द्वारा पारित संचय का परिणाम है। –

+3

बीटीडब्ल्यू, यह दृष्टिकोण संभावित रूप से बहुत बुरी तरह से स्केल करता है क्योंकि इसमें प्रतिलिपि/पुनर्विक्रय करने का एक लॉफ हो सकता है। – sellibitze

6

मुझे आपके प्रश्न के बारे में निश्चित नहीं है। समस्या कहाँ है? यह सिर्फ एक पाश का मामला है।

#include<vector> 
#include<string> 
#include<iostream> 

int main() 
{ 
    std::string str = "Hello World!"; 
    std::vector<string> vec (10,str); 

    for(size_t i=0;i!=vec.size();++i) 
     str=str+vec[i]; 
    std::cout<<str; 
} 

संपादित करें:

<algorithm>

से उपयोग for_each() इस प्रयास करें: मान लिया जाये कि इस सवाल का 6.8 है

#include<vector> 
#include<string> 
#include<iostream> 
#include<algorithm> 
using namespace std; 
string i; 
void func(string &k) 
{ 
    i+=k; 
} 
int main() { 
    string str = "Hello World!"; 
    vector<string> vec (10,str); 

    for_each(vec.begin(),vec.end(),func); 
    cout<<i; 
    return 0; 
    } 
+1

मुझे ऐसा करने के लिए एल्गोरिदम हेडर से फ़ंक्शन का उपयोग करना होगा। – Bogdan

+0

यह अच्छा नहीं है, लेकिन मुझे लगता है कि यह काम करता है, ty – Bogdan

+0

प्रश्न स्वयं ही अच्छा नहीं है। xD –

12

लागू करने के लिए कुछ भी काम करेगा, std :: copy के बारे में कैसे?

std::ostringstream os; 
std::copy(vec_strings.begin(), vec_string.end(), ostream_iterator<string>(os)); 
cout << os.str() << endl; 
6

यह स्निपेट विजुअल C++ 2012 में संकलित करता है तथा एक लैम्ब्डा समारोह का उपयोग करता है:

int main() { 
    string str = "Hello World!"; 
    vector<string> vec (10,str); 

    stringstream ss; 
    for_each(vec.begin(), vec.end(), [&ss] (const string& s) { cat(ss, s); }); 
    string a = ss.str(); 

    cout << a << endl; 
} 

1 जवाब में accumulate उदाहरण सुरुचिपूर्ण है, लेकिन जैसा कि sellibitze ने बताया, यह प्रत्येक संयोजन के साथ पुनर और ओ (एन²) पर तराजू। ओ 0 (एन) के बारे में यह for_each स्निपेट स्केल। मैंने 100 के तारों के साथ दोनों समाधानों का प्रोफाइल किया; accumulate उदाहरण में 23.6 सेकेंड लगे, लेकिन यह for_each स्निपेट ने 0.054 सेकेंड लिया।

+1

'std :: sring' कॉल' रिजर्व (अंतिम आकार) 'बनाने के लिए यह और भी तेज़ हो सकता है, फिर बस' + = 'का उपयोग करें जो तेजी से होना चाहिए क्योंकि बफर पहले से ही सही आकार से है। –

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