簡體   English   中英

如何創建元組C ++列表

[英]How to create a list of tuples C++

我對c ++很新,我真的沒有任何背景知識。 我想要創建一個元組列表,第一個將是一個int,第二個將是一個字符串。

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

並得到一個錯誤。 我希望能夠創建一個列表,添加我可以按int排序的條目,並具有描述int的字符串。

我該如何創建此列表?

對於一個簡單的列表,使用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實際上是您可能不需要的雙向鏈表的實現。

這里的答案有點過時,並沒有告訴你如何對列表進行排序。

由於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 s排序元素,然后按string s排序:

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

您可以通過索引從元組中檢索值

get<0>(data[i])

或按類型:

get<int>(data[i])

我已經整理了一個完整的例子,你可以在ideone上看到

這里可能不相關,但如果“創建部分”包含用元素填充列表,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");
}

取決於你的情景。

正如旁注:

新的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;

這應該適用於幾乎所有最近的編譯器。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM