2011-06-26 9 views
5

私はかなり新しいC++です。本当にその背景はありません。私はタプルのリストを作成しようとしています。最初はint、2番目は文字列になります。タプルのリストを作成する方法C++

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

エラーが発生しました。私は、リストを作成し、intでソートできる項目を追加し、intが何であるかを記述する文字列を追加できるようにします。

このリストはどのように作成すればよいですか?新しいC++標準では、可変引数テンプレートを紹介し、そのまたタプルと

:ちょうどサイドノートとして

+3

ダム質問:namespace std/using namespace boostを使って追加することを覚えましたか?どのようなエラーメッセージが表示されますか? – Mikola

+2

"名前空間の使用を増やす"がありますか?あなたのコードで?私はあなたが "名前空間stdを使う"必要があると思います。同じように。 –

+0

私はその目的のためにstd :: map を使うことができると思います。自動的に 'int'値でソートされた' int-string'のペアを保持します。 [Here](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

。 gccとVisual Studio(少なくとも)はこれらをサポートしています。したがって、可能な場合(つまり、サポートされているすべてのコンパイラが、既に非常に高いタプルをサポートしている場合)、これを使用することができます。

唯一の問題は、まだいくつかのコンパイラはstd :: tr1名前空間にタプルを持ち、他のコンパイラはstd名前空間にそれを持っていることです。また、時々あなたが含まれる必要があります。しかし、ビルドシステムを構成して、いくつかのスキームをサポートするのに役立つマクロを定義することができます。あなたは、たとえばだけのVisual Studio 10および/または非常に新しいgccのバージョンをサポートする必要がある場合には行うことができ、以下:

#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

ここでは関係ないかもしれませんが、 "作成部分"に要素リストを埋めている場合は、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

ここの回答は古くなっているので、リストのソート方法は教えてください。あなたがvectoremplace_back方法を使用することができますエントリを追加するには

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

C++11ので、あなたは、例えばvectorで、標準tupleを使用することができます。 ここで、標準入力からの読み込みの例です:intは、私たちの場合はタプルの最初の要素であるため、

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

は標準sort機能を使用するのに十分である、ソートするには、デフォルトのソート順はソートされます最初int Sによって要素、そして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を入れています。

関連する問題