2011-06-26 21 views
5

मैं सी ++ के लिए बिल्कुल नया हूं, मेरे पास वास्तव में कोई पृष्ठभूमि नहीं है। मैं tuples की एक सूची बनाने के लिए बांध रहा हूँ, पहला एक int होगा, दूसरा एक स्ट्रिंग होगा।tuples की सूची कैसे बनाएं C++

#include <string> 
    #include <list> 
    #include <boost/tuple/tuple.hpp> 
    .... 
    list< tuple<int,string> > time; 

और एक त्रुटि प्राप्त हो रही है। मैं एक सूची बनाने में सक्षम होना चाहता हूं, जो प्रविष्टियों को int द्वारा क्रमबद्ध कर सकता हूं, और स्ट्रिंग जो वर्णन करता है, int क्या था।

मैं इस सूची को कैसे बनाऊंगा?

+3

गूंगा प्रश्न: क्या आपको नेमस्पेस एसडीडी का उपयोग करके नामस्थान स्टेड का उपयोग करना याद रखना था? आपको प्राप्त होने वाले विशिष्ट त्रुटि संदेश क्या हैं? – Mikola

+2

क्या आपके पास "नामस्थान वृद्धि का उपयोग करना है;" आपके कोड में? मुझे लगता है कि आपको "नेमस्पेस std का उपयोग करके" की आवश्यकता है; भी। –

+0

मुझे लगता है कि, आप उस उद्देश्य के लिए std :: map का उपयोग कर सकते हैं। यह जोड़े 'int-string' रखेगा, स्वचालित रूप से 'int' मानों द्वारा क्रमबद्ध किया जाएगा। [यहां] (http://www.cplusplus.com/reference/stl/map/) विवरण है। – beduin

उत्तर

9

एक साधारण सूची के लिए std::list के बजाय std::vector का उपयोग करें।

आप शायद सिर्फ इस तरह के रूप में कुछ सरल हैं:

#include <iostream> 
#include <vector> 
#include <string> 
#include "boost/tuple/tuple.hpp" 

using namespace std; 
using boost::tuple; 

typedef vector< tuple<int,string> > tuple_list; 

int main(int arg, char* argv[]) { 
    tuple_list tl; 
    tl.push_back(tuple<int, string>(21,"Jim")); 

    for (tuple_list::const_iterator i = tl.begin(); i != tl.end(); ++i) { 
     cout << "Age: " << i->get<0>() << endl; 
     cout << "Name: " << i->get<1>() << endl; 
    } 
} 

std::list वास्तव में एक दोगुना से जुड़े सूची जो आप की जरूरत नहीं हो सकता है के एक कार्यान्वयन है।

+0

क्या इस मामले में उम्र के अनुसार इसे हल करने का कोई आसान तरीका है? क्या मुझे अपना खुद का सॉर्ट फ़ंक्शन लिखना है? – Jim

+0

यह "एक प्रकार का नाम नहीं है" त्रुटि देता है। – Natasha

0
बस एक पक्ष नोट के रूप में

:

नई सी ++ मानक variadic टेम्पलेट्स का परिचय और वह भी tuples के साथ। जीसीसी और विजुअल स्टूडियो (कम से कम) इन का समर्थन करते हैं। तो यदि यह आपके लिए संभव है (यानी यदि सभी समर्थित कंपाइलर्स टुपल्स का समर्थन करते हैं जो पहले से ही बहुत संभव है) तो आप इसका उपयोग कर सकते हैं।

एकमात्र समस्या यह है कि कुछ कंपाइलर्स अभी भी std :: tr1 नेमस्पेस में tuple है और दूसरों के पास पहले से ही std नेमस्पेस में है। कभी-कभी आपको कभी-कभी शामिल करने की आवश्यकता होती है। लेकिन आप कुछ मैक्रोज़ को परिभाषित करने के लिए अपनी बिल्ड सिस्टम को कॉन्फ़िगर कर सकते हैं जो आपको कई योजनाओं का समर्थन करने में मदद करता है। तुम कर सकते हो तुम, उदाहरण के लिए केवल दृश्य स्टूडियो 10 और/या एक काफी नया जीसीसी संस्करण का समर्थन करने के लिए की जरूरत है निम्नलिखित:

#include <list> 
#include <string> 
#include <tuple> 

std::list<std::tuple<int, string> > time; 

cmake साथ उदाहरण के लिए आप आप सभी के लिए समर्थन एक हेडर फाइल है, जो लाता है उत्पन्न कर सकता है कंपाइलर्स, जो टुपल्स का समर्थन करते हैं (और थोड़ा और काम के साथ भी गिरावट के रूप में बढ़ावा का उपयोग करते हैं)। उदाहरण की तरह दिखाई देगा ऊपर इस प्रकार

#if defined(__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__ < 430) 
# define GCC_OLDER_THAN_430 1 
#endif 

#if defined(_MSC_VER) && (_MSC_VER < 1600 /* 2010 */) 
# define MSC_OLDER_THAN_2010 1 
#endif 

#if defined(GCC_OLDER_THAN_430) 
# define TR1_IN_TR1_SUBDIRECTORY 1 
#endif 

#if defined(ZORBA_GCC_OLDER_THAN_430) || defined(ZORBA_MSC_OLDER_THAN_2010) 
# define TR1_NS_IS_STD_TR1 1 
#endif 

#ifdef TR1_NS_IS_STD_TR1 
# define TR1_NS std::tr1 
#else 
# define TR1_NS std 
#endif 

#ifdef TR1_IN_TR1_SUBDIRECTORY 
# include <tr1/tuple> 
#else 
# include <tuple> 
#endif 

फिर,:

#include <string> 
#include <list> 
#include "tuple.h" 

std::list<TR1_NS::tuple<int, std::string> > time; 

इसमें लगभग सभी पर काम करना चाहिए

ऐसा करने के लिए, आप एक tuple.h.cmake फ़ाइल की तरह कुछ बन जाएगा हाल के कंपाइलर्स

1

यहां प्रासंगिक नहीं हो सकता है, लेकिन यदि "निर्माण भाग" में तत्वों के साथ सूची भरना शामिल है, तो बूस्ट। असाइन उपयोगी हो सकता है। आप ऐसा कुछ कर सकते हैं:

#include <boost/assign/list_of.hpp> 
#include <vector> 

int main() 
{ 
    typedef boost::tuple<int, std::string> tuple; 

    std::vector<tuple> v = boost::assign::tuple_list_of(1, "foo")(2, "bar"); 
} 

आपके परिदृश्य के आधार पर।

7

यहां दिए गए उत्तरों थोड़ा पुराना हैं, और आपको यह नहीं बताते कि सूची को कैसे क्रमबद्ध किया जाए।

C++11 जब से तुम उदाहरण के लिए एक vector के साथ मानक tuple उपयोग कर सकते हैं,:

#include <tuple> 
#include <vector> 
// ... 
vector<tuple<int, string>> data; 

प्रविष्टियों को जोड़ने के लिए आप vector की emplace_back विधि का उपयोग कर सकते हैं। यहाँ एक उदाहरण मानक इनपुट से पढ़ रहा है:,

#include <iostream> 
// ... 
int age; 
string name; 
while(cin >> age >> name) data.emplace_back(age, name); 

क्रमबद्ध करने के लिए, यह मानक sort समारोह का उपयोग करने के लिए पर्याप्त है के बाद से int हमारे मामले में टपल के पहले तत्व है, डिफ़ॉल्ट छँटाई आदेश को सॉर्ट होगा int पहला, तब तक तत्वों string द्वारा:

#include <algorithm> 
// ... 
sort(data.begin(), data.end()); 

आप कर सकते हैं retrieve values from a tuple सूचकांक द्वारा:

get<0>(data[i]) 

या प्रकार के आधार पर:

get<int>(data[i]) 

मैं एक साथ एक full example that you can see live at ideone रख दिया है।

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