我对c ++很新,我真的没有任何背景知识。我想要创建一个元组列表,第一个是int,第二个是字符串。
#include <string>
#include <list>
#include <boost/tuple/tuple.hpp>
....
list< tuple<int,string> > time;
收到错误。我希望能够创建一个列表,添加我可以按int排序的条目,并且具有描述int的字符串。
我如何创建此列表?
答案 0 :(得分:12)
对于简单列表,请使用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
实际上是您可能不需要的双向链表的实现。
答案 1 :(得分:9)
这里的答案有点过时了,不要告诉你如何对列表进行排序。
自C++11以来,您可以使用标准tuple
,例如vector
:
#include <tuple>
#include <vector>
// ...
vector<tuple<int, string>> data;
要添加条目,您可以使用vector
的{{3}}方法。
以下是从标准输入读取的示例:
#include <iostream>
// ...
int age;
string name;
while(cin >> age >> name) data.emplace_back(age, name);
要进行排序,使用标准emplace_back
函数就足够了,因为int
是我们案例中元组的第一个元素,默认排序顺序将按{{1}对元素进行排序首先是int
s:
string
您可以按索引sort
:
#include <algorithm>
// ...
sort(data.begin(), data.end());
或按类型:
get<0>(data[i])
我已经整理了retrieve values from a tuple。
答案 2 :(得分: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");
}
取决于你的情景。
答案 3 :(得分: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;
这应该适用于几乎所有最近的编译器。