SORU
2 Aralık 2009, ÇARŞAMBA


Nasıl ters bir yineleyici ile silme çağrısı

Böyle bir şey yapmaya çalışıyorum:

for ( std::list< Cursor::Enum >::reverse_iterator i = m_CursorStack.rbegin(); i != m_CursorStack.rend();   i )
{
    if ( *i == pCursor )
    {
        m_CursorStack.erase( i );
        break;
    }
}

Ancak Silme bir yineleyici ve ters bir yineleyici değil alır. bir şekilde düzenli bir yineleyici veya listeden bu öğeyi kaldırmak için başka bir yol için ters bir yineleyici dönüştürmek için var mı?

CEVAP
2 Aralık 2009, ÇARŞAMBA


Biraz daha araştırma ve testlerden sonra çözümü buldum. Standart [24.4.1/1] arasındaki ilişki için görünüşe göre.() tabanı ve ben

&*(reverse_iterator(i)) == &*(i - 1)

(Dr. Dobbs article):

alt text

Bir baz alırken ofset uygulamak gerekir). Bu nedenle çözümdür:

m_CursorStack.erase( --(i.base()) );

EDİT

C 11 için güncelleme.

reverse_iterator i değişmez:

m_CursorStack.erase( std::next(i).base() );

reverse_iterator i gelişmiş:

std::advance(i, 1);
m_CursorStack.erase( i.base() );

Bu benim önceki çözüm daha net buluyorum. İhtiyacınız hangisi kullanın.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:
C++

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • GFX Tutorials

    GFX Tutorial

    12 AĞUSTOS 2013
  • isupportthegosselins

    isupporttheg

    6 Aralık 2009
  • SunsetTrance

    SunsetTrance

    20 EYLÜL 2008