2013-03-25 4 views
7

क्या वेक्टर को सी ++, win32 में वेक्टर में बदलने के लिए कुछ तरीका है?कन्वर्ट <vector><string> से <vector><int> सी ++, विन 32

मैं संख्या के साथ इस स्ट्रिंग वेक्टर मिल गया है:

std::vector<std::string> DataNumbers; 

मैं वेक्टर पूर्णांक में इस सदिश स्ट्रिंग परिवर्तित करने के लिए की जरूरत है। जानते हुए भी कि तुम क्या जब इनपुट विफल रहता है, क्या यहां कहने के लिए है और अधिक नहीं करना चाहते हैं बिना

vector<std::string> input = ...; 
vector<int> output; 

for (auto &s : input) { 
    std::stringstream parser(s); 
    int x = 0; 

    parser >> x; 

    output.push_back(x); 
} 

:

+0

वास्तव में क्या अपने लक्ष्य को यहाँ है? संख्या में कौन से प्रारूप हैं? प्रदर्शन बनाम पठनीयता कितना महत्वपूर्ण है? –

+0

मुझे केवल पूरी संख्या की आवश्यकता है। और उसके बाद मैं इस int वेक्टर –

उत्तर

2

इस प्रयास करें::

std::vector<std::string> DataNumbers; 
    // Fill DataNumbers 
    std::vector<int> intNumbers; 
    for (int i=0; i<= 5; i++) 
    { 
    int num = atoi(DataNumbers.at(i).c_str()); 
    intNumbers.push_back(num); 
    } 
+1

मुझे लगता है कि पिछले समाधान अच्छे थे, लेकिन यह मेरे लिए अच्छा काम करता है, क्योंकि मेरे कंपाइलर में "सी ++ 11 फीचर्स" नहीं है। तो धन्यवाद! –

+3

मुझे लगता है कि हार्डकोडेड लम्बाई पर निर्भर नहीं है और विरासत सी कार्यों का उपयोग करना एक अच्छा समाधान है। यदि आपके पास सी ++ 11 नहीं है, तो रिचर्ड जे रॉस के जवाब का उपयोग करें और 'ऑटो और एस: इनपुट)' के लिए 'बदलें' (वेक्टर :: iterator it = DataNumbers.begin(); it! = DataNumbers। अंत(); यह ++) 'साथ ही' std :: स्ट्रिंगस्ट्रीम पार्सर; 'to' std :: stringstream parser (* it); '। – us2012

+0

इस कोड ने मुझे कैंसर दिया। – Puppy

4

सी ++ यह ऐसा करने का तरीका यह है।

+0

धन्यवाद से कुछ संख्याओं से गुणा करना चाहता हूं। लेकिन लूप के लिए "एस" का क्या अर्थ है? स्ट्रिंग वेक्टर –

+1

इटरेटर, यह स्ट्रिंग – Alon

+1

@alon संख्या पर – jrok

19

को देखते हुए:

std::vector<std::string> DataNumbers; 
// Fill DataNumbers 
std::vector<int> Data; 

आप std::transform उपयोग कर सकते हैं। std::vector<int> में मान डालने के लिए std::back_inserter का उपयोग करें। यूनरी फ़ंक्शन के लिए, स्ट्रिंग्स को पूर्णांक में कनवर्ट करने के लिए std::stoi का उपयोग करने वाली लैम्ब्डा अभिव्यक्ति का उपयोग करें।

typedef int(*stoi_type)(const std::string&, std::size_t*, int); 
std::transform(DataNumbers.begin(), DataNumbers.end(), std::back_inserter(Data), 
       std::bind(static_cast<stoi_type>(&std::stoi), 
         std::placeholders::_1, nullptr, 10)); 
+0

मैं भेड़ के बच्चे के साथ पागल होने में संकोच करता हूं। वे आमतौर पर फॉर-लूप का उपयोग करने से धीमे होते हैं, और दीर्घ अवधि में पठनीयता का कारण बन सकते हैं। उल्लेख नहीं है कि सभी कंपाइलर्स उन्हें पूरी तरह से समर्थन नहीं करते हैं, फिर भी। –

+0

@ रिचर्ड जे। रॉस वहां एक सिंगल लैम्ब्डा है, मुझे यकीन नहीं है कि यह "पागल होने" के रूप में कैसे योग्य है। साथ ही, मुझे लगता है कि कोई भी कंपाइलर जो लैम्ब्डा को सरल के रूप में समर्थन करने में विफल रहता है, क्योंकि यह उनके दस्तावेज़ों में सी ++ 11 अनुपालन के बारे में * कुछ भी * का उल्लेख करने की हिम्मत नहीं करेगा ... – us2012

+1

@ us2012 मेरे पास एक कंपाइलर हो सकता है जो सिर्फ समर्थन करता है 'ऑटो' और 'decltype' और कहें कि इसमें" सी ++ 11 विशेषताएं "हैं, है ना? इसके अलावा, मैंने आपके जवाब को ऊपर उठाया है। –

1

के बारे में क्या:

#include <algorithm> 
#include <boost/lexical_cast.hpp> 

template<typename C1, typename C2> 
void castContainer(const C1& source, C2& destination) 
{ 
    typedef typename C1::value_type source_type; 
    typedef typename C2::value_type destination_type; 
    destination.resize(source.size()); 
    std::transform(source.begin(), source.end(), destination.begin(), boost::lexical_cast<destination_type, source_type>); 
} 

यह वेक्टर में बदल सकते हैं

std::transform(DataNumbers.begin(), DataNumbers.end(), std::back_inserter(Data), 
       [](const std::string& str) { return std::stoi(str); }); 

और यहाँ lambdas (बजाय std::bind का प्रयोग करके) के बिना एक संस्करण है < स्ट्रिंग> वेक्टर < int>, और अन्य कंटेनर < टी 1> कंटेनरटी 2>, उदाहरण: सूची -> सूची में।

पूर्ण कोड:

#include <iostream> 
#include <vector> 
#include <algorithm> 
#include <iterator> 
#include <string> 
#include <boost/lexical_cast.hpp> 

template<typename C1, typename C2> 
void castContainer(const C1& source, C2& destination) 
{ 
    typedef typename C1::value_type source_type; 
    typedef typename C2::value_type destination_type; 
    destination.resize(source.size()); 
    std::transform(source.begin(), source.end(), destination.begin(), boost::lexical_cast<destination_type, source_type>); 
} 

template<typename T, typename T2> 
std::vector<T>& operator<<(std::vector<T>& v, T2 t) 
{ 
    v.push_back(T(t)); 
    return v; 
} 

main(int argc, char *argv[]) 
{ 
    std::vector<std::string> v1; 
    v1 << "11" << "22" << "33" << "44"; 
    std::cout << "vector<string>: "; 
    std::copy(v1.begin(), v1.end(), std::ostream_iterator<std::string>(std::cout, ", ")); 
    std::cout << std::endl; 

    std::vector<int> v2; 
    castContainer(v1, v2); 

    std::cout << "vector<int>: "; 
    std::copy(v2.begin(), v2.end(), std::ostream_iterator<int>(std::cout, ", ")); 
    std::cout << std::endl; 
} 
संबंधित मुद्दे