Why does insert invalidate the std::set reverse iterator

后端 未结 1 1077
说谎
说谎 2020-12-20 02:18

My understanding is the iterators of associative containers are not invalidated during insert or erase (unless the node pointed by iterator is erased). But in the below prog

相关标签:
1条回答
  • 2020-12-20 02:45

    The promised behavior for iterators of a standard container does not hold for reverse iterators of that container.

    A reverse iterator actually stores, as a member, the normal (forward moving) iterator which comes after the element to which the reverse iterator refers when dereferenced. Then when you dereference the reverse iterator, essentially it decrements a copy of this stored normal iterator and dereferences that. So this is a problem:

    rit = rs.rbegin();     // rit stores rs.end()
    srit = rit;            // srit also stores rs.end()
    rit++;                 // rit stores a normal iterator pointing to the last element
    
    rs.erase(*srit);       // this deletes the last element, invalidating the normal
                           // iterator which is stored in rit. Funnily enough, the
                           // one stored in srit remains valid, but now *srit is a
                           // different value
    

    Reverse iterators behave this way because there is no "before begin" iterator. If they stored the iterator to the element to which they actually refer, what would rs.rend() store? I'm sure there are ways around this, but I guess they required compromises which the standards committee was not willing to make. Or perhaps they never considered this problem, or didn't consider it significant enough.

    0 讨论(0)
提交回复
热议问题