2011-06-26 67 views
5

我對C++相當陌生,我沒有真正擁有任何背景知識。我綁定創建一個元組列表,第一個將是一個int,第二個將是一個字符串。如何創建元組列表C++

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

並出現錯誤。我希望能夠創建一個列表,添加我可以用int進行排序的條目,並且具有描述int的字符串。

我該如何創建此列表?

+3

愚蠢的問題:你記得添加使用名稱空間標準/使用名稱空間提升?你得到的具體錯誤信息是什麼? – Mikola

+2

你有沒有「使用命名空間提升;」在你的代碼?我想你需要一個「使用命名空間標準;」以及。 –

+0

我想,你可以使用std :: map 來達到這個目的。它將保存對「int-string」,自動按「int」值排序。 [這裏](http://www.cplusplus.com/reference/stl/map/)是說明。 – beduin

回答

9

對於一個簡單的列表使用std::vector而不是std::list

你可能只是想簡單的東西,如:

#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

正如一個側面說明:

新的C++標準引入了可變參數模板,並與同樣元組。 gcc和Visual Studio(至少)支持這些。所以,如果它是可能的(即如果所有支持的編譯器都支持已經很可能的元組),那麼你可以使用它。

唯一的問題是,某些編譯器在std :: tr1名稱空間中仍然有元組,而其他編譯器在std名稱空間中已經有它。有時你需要包括,有時。但是您可以配置您的構建系統來定義一些可幫助您支持多種方案的宏。如果,例如只需要支持的Visual Studio 10和/或一個比較新的gcc版本,你可以做到以下幾點:

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

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

例如通過CMake,你可以生成一個頭文件,它帶給你的所有支持編譯器,它支持元組(並且稍微有更多的工作,甚至使用boost作爲後退)。

要做到這一點,你會創造這樣一個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 

然後,例如看起來像上面如下:

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

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

這應該工作在幾乎所有的最近的編譯器。

1

在這裏可能沒有關係,但如果「創建部分」包含用元素填充列表,Boost.Assign可能會有用。你可以這樣做:

#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您可以使用標準的tuple,具有vector例如:

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

要添加條目,您可以使用的vectoremplace_back方法。 這裏有一個例子從標準輸入讀取:

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

進行排序,就足夠了使用標準sort功能,因爲int是在我們的情況下,元組的第一個元素,默認的排序順序將排序通過元素int第一個,然後通過string S:

#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