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

  • Glyn Dewis

    Glyn Dewis

    25 AĞUSTOS 2007
  • manadude21

    manadude21

    11 Mart 2008
  • ShoSho

    ShoSho

    20 Ocak 2010