About erasing iterators (ohierarchyholder.cxx, package module)

Jan Holesovsky kendy at suse.cz
Tue Aug 27 00:04:58 PDT 2013


Hi Julien,

julien2412 píše v Po 26. 08. 2013 v 21:41 -0700:

> I'm taking a look to the use of erase on iterators.
> I found this example:
>     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 ;-)

> 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.

[1] http://en.wikipedia.org/wiki/Erase-remove_idiom

Regards,
Kendy



More information about the LibreOffice mailing list