2011-10-18 18 views
0

フレームをstd :: listに格納するアニメーションクラスがあり、ヘッダファイルがイテレータを宣言しています。イテレータを時間を使ってインクリメントします。アニメーションを(現在の位置から)逆にしようとするまで、私のアニメーションは正常に動作していますが、イテレータを減らすことはできません(双方向ですか?)。私はリバースイテレータを格納することについても考えましたが、2つの間を切り替えるための良い方法を見つけることができません。順方向と逆方向の繰り返しの変更

順方向反復と逆方向反復を(std :: listの先頭から開始することなく)シームレスに切り替えるにはどうすればよいですか。

+0

は、あなたの代わりに 'のstd :: vector'を使用して考えがありますか?リストは場所のいたるところに多くの挿入と削除がありますが、アニメーションがあれば便利です。私はこれが当てはまるとは思わない。 –

+2

動作していないものについては、いくつかのサンプルコードなしで答えることはできません。 'std :: list'イテレータは双方向で、' --'はそれらに対して働きます。 –

+0

私はもともとベクトルを使用していましたが、これが問題を解決するかどうかを確認するためにリストに変更されました(イテレータはおそらく双方向です)。 – replicant

答えて

0

「イテレータを減らすことはできません」とはどういう意味ですか?私のVisual C++ 2010年

、これは動作します:

std::list<int> l; 
l.push_back(1); 
l.push_back(2); 
l.push_back(3); 

auto i = l.end(); 
while (i != l.begin()) { 
    --i; 
    std::cout << *i << std::endl; 
} 
1

あなたがリスト反復子をデクリメントすることができるはずです。あなたのコードを見ることなく、それが作り出すエラーによって、私は何が間違っているのか推測できません。

しかし、一般的なイテレータ範囲としてアニメーションを表現する方が便利かもしれません:

template <typename ForwardIterator> 
void animate(ForwardIterator start, ForwardIterator end) 
{ 
    for (; start != end; ++start) { 
     start->display(); 
    } 
} 

std::vector<frame> animation = ...; 
animate(animation.begin(), animation.end()); // play forwards 
animate(animation.rbegin(), animation.rend()); // play backwards 
関連する問題