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

  • huyked

    huyked

    28 Mart 2008
  • Jonathan Leack

    Jonathan Lea

    26 ŞUBAT 2007
  • Tube Time

    Tube Time

    14 Mayıs 2013