我有下一个问题: 我创建了结构:
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的每个元素)都没有变化。在方法中我们看到变化,但是在它变成类似构造函数之后,状态仍然是相同的。 请告诉我,我做错了什么?
答案 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 尽管存在逻辑问题,这可能会阻止某些州的修改,但我看不出,为什么你的代码根本不起作用,至少在我浏览你发布的片段时是这样。