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

  • 3biblecom

    3biblecom

    23 NİSAN 2011
  • Fuse

    Fuse

    21 Kasım 2005
  • KRQE

    KRQE

    6 AĞUSTOS 2007