2012-06-02 113 views
1

的阵列最有效的方法我有一个像结构:返回struct成员

struct ohlc{ 
    double open,high,low,close; 
}; 

部分我的应用程序利用这些收集的。有时候打上时间戳。我的应用程序的另一部分使用第三方(封闭)库,它需要双倍数组,例如关闭[]或打开[]等。

什么是最适合的容器和方法来返回一个双数组的开放[],关闭[]等。目前,我使用矢量和迭代整个集合创建阵列。有没有更有效的方法。

我可能会完全错误,我目前使用的结构?我拥有的是价格/价格的价格。我尝试保留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

你是如何返回vector的,并且调用者是否需要拥有它的副本?他们需要能够写信给它吗?也许一个代码片段显示了如何从矢量中获取数组并将其传递给第三方API将会有所帮助。 – juanchopanza

+0

会将示例添加到我的原始 – stratman

回答

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>,那么你基本上是出于运气 - 你确实需要的openclose会员出这个向量的元素复制到其自己的容器。但即使在这里,我建议你在代码中使用vector,而不是C数组。

+0

关于向量vs c数组的好处。我应该记住,我可以使用这种方式。我会尝试传递载体。 – stratman