我有一个结构:
struct ohlc{
double open,high,low,close;
};
我的部分应用程序使用了这些的集合。有时带有时间戳。我的应用程序的另一部分使用第三方(封闭)库,需要双打数组,例如关闭[]或打开[]等。
返回open [],close []等双数组的最合适的容器和方法是什么。目前,我使用vector并遍历整个集合来创建数组。有没有更有效的方式。
我目前对结构的使用可能完全错了?我所拥有的是买入/卖出价格的价格。我尝试维护M1,M5,M15和H1蜡烛棒的集合,即OHLC数据。通常我只需要100小时的数据。随着价格的新一分钟的到来,我可以删除最早的分钟,从而随时保持100小时的数据价值。由于H1,M15,M5,M1都可以从带时间戳的询价/出价的基础数据中创建,出于性能原因,我是否还需要保持独立的H1,M15等。我问这是因为它是重复的数据?
编辑:我目前的方法对我的惯常目的是好的,但现在我'回测',我在我的代码上投入了数百万的买/卖价,并且需要它尽可能高效。背部测试目前可能需要数小时才能完成我从我的结构集合返回如下:
std::vector<double> Series::EODSeries::open( const_iterator iter, unsigned long num ) const
{
vector<double> v;
if( iter == end() )
return v;
// reverse iterator init skips the first element in collection. We must manually insert the current element.
v.insert(v.begin(), iter->second.open);
unsigned i = 1;
for( const_reverse_iterator rev_iter(iter); i < num && rev_iter != rend(); ++rev_iter, ++i )
v.insert(v.begin(), rev_iter->second.open);
return v;
}
答案 0 :(得分:3)
你说第三方应用程序需要双打数组,但这有点误导,因为数组不能成为C ++中的参数 - 它们总是衰减为指针。
所以你可以做的只是将指针传递给向量的第一个参数。这可以保证有效。
// Assuming the following signature:
void the_method(double arg[]);
// is actually the same as:
// void the_method(double* arg);
std::vector<double> open; // your vector
the_method(&open[0]);
但是,如果我误解了你并且你实际上有一个std::vector<ohlc>
那么你基本上没有运气 - 你确实需要从这个向量的元素中复制open
和close
成员进入自己的容器。但即使在这里,我建议您在代码中使用 vector
,而不是C数组。