正如一個側面說明:
新的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;
這應該工作在幾乎所有的最近的編譯器。
愚蠢的問題:你記得添加使用名稱空間標準/使用名稱空間提升?你得到的具體錯誤信息是什麼? – Mikola
你有沒有「使用命名空間提升;」在你的代碼?我想你需要一個「使用命名空間標準;」以及。 –
我想,你可以使用std :: map來達到這個目的。它將保存對「int-string」,自動按「int」值排序。 [這裏](http://www.cplusplus.com/reference/stl/map/)是說明。 –
beduin