Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 返回结构成员数组的最有效方法_C++_Candlestick Chart - Fatal编程技术网

C++ 返回结构成员数组的最有效方法

C++ 返回结构成员数组的最有效方法,c++,candlestick-chart,C++,Candlestick Chart,我有一个类似的结构: struct ohlc{ double open,high,low,close; }; 我的应用程序的一部分使用了它们的集合。有时有时间戳。我的应用程序的另一部分使用第三方(封闭)库,该库需要双精度数组,例如close[]或open[]等 返回open[]和close[]等双数组的最合适的容器和方法是什么。目前,我使用vector并遍历整个集合来创建数组。有没有更有效的方法 我现在使用的struct甚至可能是完全错误的?我有一个出价/要价的价格反馈。我试图维护M1

我有一个类似的结构:

struct ohlc{
    double open,high,low,close;
};
我的应用程序的一部分使用了它们的集合。有时有时间戳。我的应用程序的另一部分使用第三方(封闭)库,该库需要双精度数组,例如close[]或open[]等

返回open[]和close[]等双数组的最合适的容器和方法是什么。目前,我使用vector并遍历整个集合来创建数组。有没有更有效的方法

我现在使用的struct甚至可能是完全错误的?我有一个出价/要价的价格反馈。我试图维护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; 
}
std::vector Series::EODSeries::open(常量迭代器iter,unsigned long num)常量
{
向量v;
如果(iter==end())
返回v;
//反向迭代器init跳过集合中的第一个元素。我们必须手动插入当前元素。
v、 插入(v.begin(),iter->second.open);
无符号i=1;
对于(常量反向迭代器rev_iter(iter);isecond.open);
返回v;
}

你说第三方应用需要双倍数组,但这有点误导,因为数组不能是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]);
//假设以下签名:
取消_方法(双参数[]);
//实际上与:
//取消_方法(双*arg);
std::矢量开放;//你的向量
_方法(&open[0]);

但是,如果我误解了你,你实际上有一个
std::vector
,那么你基本上是运气不好的–你确实需要将
open
close
成员从这个向量的元素复制到它自己的容器中。但即使在这里,我也建议您在代码中使用
向量,而不是C数组。

如何返回向量,调用方是否需要拥有向量的副本?他们需要能够给它写信吗?也许一段代码片段可以帮助您从矢量中获取一个数组并将其传递给第三方API。它将为我的原始观点添加关于矢量与c数组的示例。我应该记得我可以这样使用向量。我将尝试传递向量。