2011-12-20 33 views
30

सी ++ में, स्याही के वेक्टर (यानी vector<int>) को स्ट्रिंग में बदलने का सबसे आसान तरीका क्या है?एक वेक्टर को स्ट्रिंग करने के लिए

+4

क्या एक स्ट्रिंग? आप प्रत्येक पूर्णांक को स्ट्रिंग में कनवर्ट करने का इरादा कैसे रखते हैं? क्या वे ASCII वर्ण कोड का प्रतिनिधित्व करते हैं, या आप संख्याओं की अल्पविराम से अलग सूची बनाने की कोशिश कर रहे हैं? – meagar

+0

आप आउटपुट को किस तरह दिखाना चाहते हैं? – Mark

+0

वेक्टर कहें: [1, 4, 7, 4, 9, 7], स्ट्रिंग "1,4,7,4,9,7" – shn

उत्तर

40

शायद std::ostream_iterator और std::ostringstream:

#include <vector> 
#include <string> 
#include <algorithm> 
#include <sstream> 
#include <iterator> 
#include <iostream> 

int main() 
{ 
    std::vector<int> vec; 
    vec.push_back(1); 
    vec.push_back(4); 
    vec.push_back(7); 
    vec.push_back(4); 
    vec.push_back(9); 
    vec.push_back(7); 

    std::ostringstream oss; 

    if (!vec.empty()) 
    { 
    // Convert all but the last element to avoid a trailing "," 
    std::copy(vec.begin(), vec.end()-1, 
     std::ostream_iterator<int>(oss, ",")); 

    // Now add the last element with no delimiter 
    oss << vec.back(); 
    } 

    std::cout << oss.str() << std::endl; 
} 
+7

होगी यह ध्यान देने योग्य है कि 'vec.end() - 1 'केवल तभी परिभाषित किया गया है जब कोई जानता है कि _ vec' खाली नहीं है। – ildjarn

+1

@ildjarn: अच्छा बिंदु। 'Vec.back()' के लिए वही। इस दृष्टिकोण के साथ –

+0

, क्या किसी प्रकार की पैडिंग को मजबूर करना संभव है? उदाहरण के लिए, सभी संख्याओं को 4 पदों का उपयोग करने के लिए, उनके पास –

5

यहाँ एक विकल्प है जो एक कस्टम उत्पादन iterator का उपयोग करता है। यह उदाहरण रिक्त सूची के मामले के लिए सही तरीके से व्यवहार करता है। यह उदाहरण दर्शाता है कि कस्टम आउटपुट इटरेटर कैसे बनाएं, std::ostream_iterator के समान।

#include <iterator> 
#include <vector> 
#include <iostream> 
#include <sstream> 

struct CommaIterator 
: 
    public std::iterator<std::output_iterator_tag, void, void, void, void> 
{ 
    std::ostream *os; 
    std::string comma; 
    bool first; 

    CommaIterator(std::ostream& os, const std::string& comma) 
    : 
    os(&os), comma(comma), first(true) 
    { 
    } 

    CommaIterator& operator++() { return *this; } 
    CommaIterator& operator++(int) { return *this; } 
    CommaIterator& operator*() { return *this; } 
    template <class T> 
    CommaIterator& operator=(const T& t) { 
    if(first) 
     first = false; 
    else 
     *os << comma; 
    *os << t; 
    return *this; 
    } 
}; 

int main() { 
    // The vector to convert 
    std::vector<int> v(3,3); 

    // Convert vector to string 
    std::ostringstream oss; 
    std::copy(v.begin(), v.end(), CommaIterator(oss, ",")); 
    std::string result = oss.str(); 
    const char *c_result = result.c_str(); 

    // Display the result; 
    std::cout << c_result << "\n"; 
} 
34

मैं आमतौर पर यह इस तरह से करते हैं ...

#include <string> 
#include <vector> 

int main(int argc, char* argv[]) 
{ 
    std::vector<char> vec; 
    //... do something with vec 
    std::string str(vec.begin(), vec.end()); 
    //... do something with str 
    return 0; 
} 
+0

क्या मुख्य फाइलों को शामिल किया जाना चाहिए? – qed

+0

यह प्रदर्शन उद्देश्य के लिए अच्छा है, लेकिन मनमाने ढंग से डेलीमीटर के साथ जुड़ने के लिए इसका उपयोग नहीं किया जा सकता है। – mtk

0
template<typename T> 
string str(T begin, T end) 
{ 
    stringstream ss; 
    bool first = true; 
    for (; begin != end; begin++) 
    { 
     if (!first) 
      ss << ", "; 
     ss << *begin; 
     first = false; 
    } 
    return ss.str(); 
} 

यह str समारोह पूर्णांकों एक स्ट्रिंग में और क्या पूर्णांक का प्रतिनिधित्व करता है के लिए एक चार में बारी कर सकते हैं। युगल के लिए भी काम करता है।

+0

मैं स्ट्रिंग नामक फ़ंक्शन पर कॉल के साथ अपने स्ट्रिंग कन्स्ट्रक्टर कॉल को उलझन में डाल रहा था। Druciferre संख्याओं की एक अलग अल्पविराम सूची मुद्रित नहीं करेगा, यह संख्याओं को चार में बदलने की कोशिश करेगा। – kpgbrink

+0

खेद है कि सवाल यह जानने के लिए पर्याप्त नहीं था कि वह वास्तव में क्या चाहता था। मैंने अन्य टिप्पणियां नहीं पढ़ीं। – kpgbrink

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