c++ - 无法保存结构内容

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

因此,我们称此构造函数为它通过蜡烛值填充对象。 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/

相关文章:

c++ - 如何实现指向其他多类型 vector 的 C++ vector ?

c++ - 检测静态初始化阶段?

C++ 模板类自引用

c++ - 谷歌在同一解决方案中测试多个 C++ 项目

c++ - C++中的哈希表错误

c++ - push_back 的更快替代方案(大小已知)

c++ - 查找 vector 中的最小值

C 编译器忽略 'static' 的结构声明

c++ - 如何在 C++ 中声明结构变量

c - 如何访问声明为结构类型的指针变量的值