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

  • chickenby

    chickenby

    2 HAZİRAN 2008
  • ETrade Supply

    ETrade Suppl

    23 Temmuz 2011
  • Perihelion

    Perihelion

    23 NİSAN 2008