使用精神::业力从元组的向量制作重新排序的元组
Make reordered tuple from vector of tuple with use spirit::karma
#include <tuple>
#include <vector>
#include <string>
#include <iostream>
//-------------------------------------------------------------------------
#include <boost/spirit/include/karma.hpp>
#include <boost/fusion/adapted/std_tuple.hpp>
//-------------------------------------------------------------------------
namespace ph = boost::phoenix;
namespace karma = boost::spirit::karma;
typedef std::back_insert_iterator<std::string> Sink;
typedef std::tuple<double,int> Data;
typedef std::vector<Data> Container;
struct Generator : karma::grammar<Sink,Container()>
{
Generator(void) : Generator::base_type(start,"Generator")
{
start = data % karma::eol;
//data = karma::delimit[???];
return;
}
karma::rule<Sink,Container()> start;
karma::rule<Sink,Data()> data;
};
//-------------------------------------------------------------------------
int main(int argc,char** argv)
{
Generator generator;
Container container;
container.push_back(Data(3.1415,100500));
container.push_back(Data(2.7183,9000));
std::string result;
Sink sink(result);
bool b = boost::spirit::karma::generate(sink,generator,container);
std::cerr << (b == true ? result : std::string("Error!")) << std::endl;
return 0;
}
在规则数据中(例如(,我需要在双精度之前生成 int 并使用它进行算术运算。如何在数据规则的语义操作中访问合成属性(元组(的元素?
目前我能想到的最快的解决方案很简单:
data = delimit [ int_ [ _1 = at_c<1>(_val) ] << double_ [ _1 = at_c<0>(_val) ] ];
因此,完整示例如下所示:
#include <boost/spirit/include/karma.hpp>
#include <boost/spirit/include/phoenix.hpp>
#include <boost/spirit/include/phoenix_operator.hpp>
#include <boost/fusion/adapted.hpp>
#include <boost/tuple/tuple.hpp>
//-------------------------------------------------------------------------
namespace ph = boost::phoenix;
namespace karma = boost::spirit::karma;
typedef std::back_insert_iterator<std::string> Sink;
typedef boost::tuple<double,int> Data;
typedef std::vector<Data> Container;
struct Generator : karma::grammar<Sink,Container()>
{
Generator(void) : Generator::base_type(start,"Generator")
{
using namespace karma;
using namespace ph;
data = delimit [ int_ [ _1 = at_c<1>(_val) ] << double_ [ _1 = at_c<0>(_val) ] ];
start = data % eol;
return;
}
karma::rule<Sink,Container()> start;
karma::rule<Sink,Data()> data;
};
//-------------------------------------------------------------------------
int main(int argc,char** argv)
{
Generator generator;
Container container;
container.push_back(Data(3.1415,100500));
container.push_back(Data(2.7183,9000));
std::string result;
Sink sink(result);
bool b = boost::spirit::karma::generate(sink,generator,container);
std::cerr << (b == true ? result : std::string("Error!")) << std::endl;
return 0;
}
输出:
100500 3.142
9000 2.718
相关文章:
- 对任何类型的元素数组进行排序
- C++ 按数值对元组<字符串、浮点数>然后按字典顺序排序的向量
- 如何构造元组向量并像配对一样对它们进行排序?
- 编译时排序的异构元组
- 将一个数组的每个元素乘以另一个数组的每个元素,并对新的非常大的数组进行排序
- 如何对两个容器元组进行排序?
- 元组上的推力排序非常慢
- 基于元组值对向量进行排序
- 按固定组件对元组容器进行排序
- 比较具有替代排序的自定义类型的std::元组(或std::对).是否可以插入自定义的小于/比较函数
- 对boost元组的数据进行排序
- 我正在尝试通过计算元素来对数组进行排序,然后再次对它们进行排序"counting sort"
- 如何将未排序数组的排序索引放入新数组中
- 如何从旧的元组类型和boost中的类型创建新的元组类型
- 使用精神::业力从元组的向量制作重新排序的元组
- 大POD作为元组进行排序
- 如何任意对元组的类型进行排序?
- 如何使用现有的整数排序来排序整数元组
- 元组是如何自动排序的
- 自定义对元组向量进行排序