无法保存结构内容

时间:2012-12-13 15:32:19

标签: c++ vector struct

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

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);
  }
}

所以,然后我们称之为construcor,它通过烛光来填充对象。 LookFor - 是矢量系列中的一些蜡烛。 初始化之后我想更新这个系列(如果有更多的新蜡烛,我想删除最后一个并在vector-serie的开头插入新的)

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

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

vector vec;    vec.push_back(系列(3));

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

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

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

1 个答案:

答案 0 :(得分:0)

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

  • 您可以将迭代器接口用于此类容器:

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

  • 对于您的任务,请考虑使用双端队列或列表作为循环缓冲区而不是蜡烛的向量。它对插入效果会更好,因此您可以使用push_front()代替emplace()insert()。 或者,您可以保持向量元素的索引刚好超过最后一个元素(应该是第一个)并且只分配新的蜡烛,等等,您有一个密集的循环缓冲区。 有这样的循环缓冲区的实现,例如boost之一: http://www.boost.org/doc/libs/1_52_0/libs/circular_buffer/doc/circular_buffer.html

尽管存在逻辑问题,这可能会阻止某些州的修改,但我看不出,为什么你的代码根本不起作用,至少在我浏览你发布的片段时是这样。