2011-06-26 70 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