About erasing iterators (ohierarchyholder.cxx, package module)

Julien Nabet serval2412 at yahoo.fr
Tue Aug 27 23:43:44 PDT 2013


On 27/08/2013 09:04, Jan Holesovsky wrote:
>      289 void OHierarchyElement_Impl::RemoveElement( const ::rtl::Reference<
> OHierarchyElement_Impl>&  aRef )
>      290 {
>      291     {
>      292         ::osl::MutexGuard aGuard( m_aMutex );
>      293         OHierarchyElementList_Impl::iterator aIter =
> m_aChildren.begin();
>      294         const OHierarchyElementList_Impl::const_iterator aEnd =
> m_aChildren.end();
>      295         while (aIter != aEnd)
>      296         {
>      297             if (aIter->second == aRef )
>      298                 aIter = m_aChildren.erase(aIter);
>      299             else
>      300                 ++aIter;
>      301         }
>      302     }
> See
> http://opengrok.libreoffice.org/xref/core/package/source/xstor/ohierarchyholder.cxx#298
>
> Is it ok to use "aEnd" or, since erase may  be called, we should change the
> while into:
> while (aIter != m_aChildren.end())
> (and remove aEnd)
> In this exact case (when the value may be present more times in the
> vector), you might want to use the Erase-remove idiom [1]:
>
> // remove all occurrences of aRef
> m_aChildren.erase(std::remove(m_aChildren.begin(), m_aChildren.end(), aRef), m_aChildren.end());
>
> Even with the comment I suppose, so that people who haven't read tons of
> C++ books can see what's going on ;-)
I copy pasted this exact line and it failed to compile :-(
>> Another thing: couldn't we break the loop after erase or could aRef be
>> present several times?
> Not sure - worth checking the history of that file I think.
According to git history, it's been like this since first git log, so 
let's let this.
About end iterator, it was my fault since I had created a const end 
iterator in the beginning of this year. I've fixed this (see 
http://cgit.freedesktop.org/libreoffice/core/commit/?id=9ebcd5ec54ec5d77cf46849f7f00bf915644f6e1)

Julien


More information about the LibreOffice mailing list