2011-06-26 52 views
5

Tôi khá mới với C++, tôi thực sự không có bất kỳ nền tảng nào trong đó. Tôi buộc phải tạo một danh sách các bộ dữ liệu, phần đầu tiên sẽ là một int, phần thứ hai sẽ là một chuỗi.Cách tạo danh sách các bộ dữ liệu C++

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

Và gặp lỗi. Tôi muốn có thể tạo một danh sách, thêm các mục mà tôi có thể sắp xếp theo int, và có chuỗi mô tả, int là gì.

Làm cách nào để tạo danh sách này?

+3

Câu hỏi ngớ ngẩn: Bạn có nhớ thêm bằng cách sử dụng tăng không gian tên không gian tên/sử dụng không gian tên không? Các thông báo lỗi cụ thể mà bạn đang nhận được là gì? – Mikola

+2

Bạn có "tăng không gian tên sử dụng không"; trong mã của bạn? Tôi đoán bạn cần một "using namespace std;" cũng. –

+0

Tôi nghĩ rằng, bạn có thể sử dụng std :: map cho mục đích đó. Nó sẽ giữ cặp 'int-string', tự động được sắp xếp theo giá trị' int'. [Ở đây] (http://www.cplusplus.com/reference/stl/map/) là mô tả. – beduin

Trả lời

9

Để biết danh sách đơn giản, hãy sử dụng std::vector thay vì std::list.

Có thể bạn chỉ muốn một cái gì đó đơn giản như:

#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 thực sự là một thực hiện một danh sách gấp đôi liên kết mà bạn có thể không cần.

+0

Có cách nào dễ dàng để sắp xếp nó trong trường hợp này theo độ tuổi? Tôi có phải viết chức năng sắp xếp của riêng mình không? – Jim

+0

Điều này cho biết lỗi "không đặt tên loại". – Natasha

0

Cũng giống như một lưu ý phụ:

Chuẩn C++ mới giới thiệu các mẫu biến thể và với các bộ dữ liệu đó. gcc và Visual Studio (ít nhất) hỗ trợ chúng. Vì vậy, nếu có thể cho bạn (tức là nếu tất cả các trình biên dịch được hỗ trợ hỗ trợ bộ dữ liệu đã rất có khả năng), bạn có thể sử dụng nó.

Vấn đề duy nhất là, một số trình biên dịch vẫn có tuple trong không gian tên std :: tr1 và những người khác đã có nó trong không gian tên std. Đôi khi bạn cần phải bao gồm và đôi khi. Nhưng bạn có thể cấu hình hệ thống xây dựng của bạn để xác định một số macro giúp bạn hỗ trợ một số lược đồ. Nếu bạn, ví dụ chỉ cần hỗ trợ Visual Studio 10 và/hoặc một phiên bản gcc khá mới, bạn có thể làm như sau:

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

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

Ví dụ với cmake bạn có thể tạo một tập tin tiêu đề, mà mang đến cho bạn hỗ trợ cho tất cả các trình biên dịch, hỗ trợ các bộ dữ liệu (và với nhiều công việc hơn nữa thậm chí sử dụng tăng như là một sự sụp đổ trở lại).

Để làm điều này, bạn sẽ tạo ra một cái gì đó giống như một tập tin tuple.h.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 

Sau đó, ví dụ trên sẽ trông giống như sau:

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

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

này nên hoạt động trên hầu hết tất cả các trình biên dịch gần đây.

1

Có thể không có liên quan ở đây, nhưng nếu "phần tạo" chứa đầy danh sách với các yếu tố, Boost.Assign có thể hữu ích. Bạn có thể làm một cái gì đó như thế này:

#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"); 
} 

Tùy thuộc vào kịch bản của bạn.

7

Câu trả lời ở đây hơi lỗi thời và không cho bạn biết cách sắp xếp danh sách.

Kể từ C++11 bạn có thể sử dụng các tiêu chuẩn tuple với vector ví dụ:

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

Để thêm các mục bạn có thể sử dụng phương pháp emplace_back của vector. Dưới đây là một ví dụ đọc từ đầu vào tiêu chuẩn:

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

Để sắp xếp, nó là đủ để sử dụng các tiêu chuẩn sort chức năng, vì int là yếu tố đầu tiên của tuple trong trường hợp của chúng tôi, thứ tự mặc định sắp xếp sẽ sắp xếp yếu tố bởi int đầu tiên, sau đó bởi string s:

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

Bạn có thể retrieve values from a tuple bởi chỉ số:

get<0>(data[i]) 

hoặc theo loại:

get<int>(data[i]) 

tôi đã đặt cùng một full example that you can see live at ideone.

Các vấn đề liên quan