如何创建元组列表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;
要添加条目,可以使用vector
的emplace_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命名空间中仍然有tuple,而另一些编译器已经在std命名空间中有了tuple。有时你也需要包括和。但是,您可以将构建系统配置为定义一些宏,这有助于支持多种方案。例如,如果您只需要支持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;
这应该适用于几乎所有最新的编译器。
- Pybind11:将元组列表从Python传递到C++
- 在函数呼叫时,请从异质初始化列表中构建元组
- C++ 中的 n 元组列表
- 从c++向python返回复杂列表的元组
- 有没有一种方法可以将左值和右值的列表分别转换为具有引用类型和完整类型的元组
- 如何将函数应用于可变参数列表并将它们猫到元组
- 从类型列表创建向量元组
- 初始化类成员初始值设定项列表中的向量元组
- 将元组传递给函数并让它返回数字列表的最佳方法
- 返回 vector<pair<int,int>> & from c++ 方法到 python 使用 swig typemap 的元组列表
- 成员初始值设定项列表:从返回元组的函数初始化两个成员
- 多类型容器(数组/向量/列表)传统上是如何在C++实现的?(当然没有元组)
- 如何创建类型列表以扩展到元组
- 将元组列表传递到C++函数中
- C++使用谓词查找元组列表中的元素
- 用于存储元组键的数据结构:参数关系列表
- 托管C++中的列表<元组<int,浮点>>
- 解压缩元组列表
- 如何创建元组列表C++
- 元组列表c++ 11/1y