我有下一个问题: 我创建了结构:
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 - 是 vector 系列中的许多蜡烛。 初始化后我想更新这个系列(如果有更多新蜡烛,我想删除最后一个并在 vector 系列的开头插入新的)
void Series::Update()
{
if (size()==LookFor)
{
if (newer(cantype,c1))
{
Candle cantype = Candle(1);
Candle c1 = at(0);
pop_back();
emplace(begin(),cantype);
}
}
我需要初始化这些系列的 vector :
vector vector ; vec.push_back(系列(3));
并且构造函数完成了它的工作,一切都很好。 但后来我更新了它们:
for (size_t x =0; x<=size()-1;x++) vec[x].Update();
我有一个问题:它无法保存 vector 中的更改。在 Update 方法中,一切都很好,它本身插入了所需的蜡烛,但随后方法结束 - vector 的状态(vec 的每个元素)没有变化。在 method 中我们看到了变化,但是 vector 之后变成了 constructor-like 之后,state 还是一样的。 请告诉我,我做错了什么?
最佳答案
正如其他人已经提到的,不要从这些容器派生(可能导致严重错误,例如缺少 dtor 调用和内存泄漏,这些容器中不存在虚拟析构函数)。相反,如果您进行私有(private)继承,则将 vector 添加为成员或保持原样。
您可以为此类容器使用迭代器接口(interface):
for(std::vector<Series>::iterator sIt = vec.begin();sIt != vec.end();++sIt) sIt->Update();
- 对于您的任务,考虑使用双端队列或列表作为循环缓冲区而不是蜡烛的 vector 。它会更好地进行插入,因此允许您使用
push_front()
而不是emplace()
或insert()
. 或者,您可以持有刚好超过最后一个元素(应该是第一个)的 vector 元素的索引,然后只分配新的蜡烛,等等,您有一个密集的圆形缓冲区。 有这样的循环缓冲区的实现,例如 boost 之一: http://www.boost.org/doc/libs/1_52_0/libs/circular_buffer/doc/circular_buffer.html
尽管逻辑问题可能会阻止某些状态下的修改,但我不明白为什么您的代码根本不起作用,至少在我查看您发布的代码片段时是这样。
关于c++ - 无法保存结构内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13863146/