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; vec.push_back(シリーズ(3));

そしてコンストラクターはその仕事をします、すべてがうまくいきます。しかし、私はそれらを更新します:

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

問題があります。ベクターの変更を保存できません。Update メソッドではすべて問題なく、必要なろうそくをそれ自体に挿入しますが、メソッドは終了します - ベクトル (vec の各要素) の状態は変更されません。メソッドでは変更が見られますが、ベクトルがコンストラクターのようになった後、状態は同じままです。教えてください、私は何が間違っていますか?

4

1 に答える 1

0
  • 他の人が既に述べたように、これらのコンテナから派生させないでください (dtor 呼び出しの欠落やメモリ リークなどの厄介なエラーが発生する可能性があります。これらのコンテナには仮想デストラクタが存在しません)。代わりに、プライベート継承を行う場合は、ベクターをメンバーとして追加するか、そのままにしておきます。

  • このようなコンテナには iterator インターフェイスを使用できます。

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

  • あなたのタスクでは、ろうそくのベクトルの代わりに循環バッファーとして両端キューまたはリストを使用することを検討してください。挿入のパフォーマンスが向上するため、 orpush_front()の代わりに使用できます。または、最後の要素 (最初の要素) のすぐ後ろにあるベクトル要素のインデックスを保持し、新しいローソク足を割り当てるだけで、高密度の循環バッファーが得られます。このような循環バッファーの実装があります。たとえば、boost の実装です: http://www.boost.org/doc/libs/1_52_0/libs/circular_buffer/doc/circular_buffer.htmlemplace()insert()

特定の状態での変更を妨げる可能性のあるロジックの問題にもかかわらず、少なくとも投稿したスニペットを調べたときは、コードがまったく機能しない理由がわかりません。

于 2012-12-13T16:18:10.983 に答える