1

我有下一个问题:我创建了结构:

struct Series : vector<Candle>
{ 
 Security Sec;
 int LookFor;
 int TF;
 int Corrector;
 string ID;
 int line;
 Series(){};
 Series (int _lookfor);
 void Update();  
};

构造函数:

Series::Series (int _lookfor)
{
 LookFor=_lookfor;
 for (int i = 1; i<=LookFor; i++)
  {
    Candle cantype = Candle(i);
    push_back(cantype);
  }
}

因此,我们称这个构造函数为它用蜡烛值填充对象。LookFor - 是向量系列中的许多蜡烛。初始化后我想更新这个系列(如果有更多新蜡烛,我想删除最后一个并在矢量系列的开头插入新的)

void Series::Update()
{
if (size()==LookFor)
{
        if (newer(cantype,c1))
        {
          Candle cantype = Candle(1);
          Candle c1 = at(0);
          pop_back();
          emplace(begin(),cantype);
        }
}

我需要初始化这些系列的向量:

向量向量;vec.push_back(系列(3));

构造函数完成了它的工作,一切都很好。但后来我更新了它们:

for (size_t x =0; x<=size()-1;x++) vec[x].Update();

我有一个问题:它无法保存向量中的更改。在 Update 方法中一切都很好,它在自身中插入所需的蜡烛,但随后方法结束 - 向量的状态(vec 的每个元素)没有变化。在方法中我们看到了变化,但是在它的向量变成了类似构造函数之后,状态还是一样的。请告诉我,我做错了什么?

4

1 回答 1

0
  • 正如其他人已经提到的,不要从这些容器中派生(可能会导致令人讨厌的错误,例如缺少 dtor 调用和内存泄漏,这些容器中不存在虚拟析构函数)。相反,如果您进行私有继承,请将向量添加为成员或保持原样。

  • 您可以对此类容器使用迭代器接口:

for(std::vector<Series>::iterator sIt = vec.begin();sIt != vec.end();++sIt) sIt->Update();

  • 对于您的任务,请考虑使用双端队列或列表作为循环缓冲区,而不是蜡烛的向量。它在插入时会表现得更好,因此允许您使用push_front()而不是emplace()or insert()。或者,您可以在最后一个元素(应该是第一个元素)之后保存向量元素的索引,然后分配新的蜡烛,等等,您就有了一个密集的循环缓冲区。有这种循环缓冲区的实现,例如 boost 之一:http: //www.boost.org/doc/libs/1_52_0/libs/circular_buffer/doc/circular_buffer.html

尽管存在逻辑问题,这可能会阻止在某些状态下进行修改,但我看不出为什么您的代码根本不起作用,至少在我浏览您发布的片段时没有。

于 2012-12-13T16:18:10.983 回答