Improved efficiency of CSequence::removeIf, but CCollection::removeIf must still use the old algorithm.

This commit is contained in:
Mathew Sutcliffe
2016-01-09 18:21:36 +00:00
parent 956d54ba32
commit 6ddce24f0c
3 changed files with 49 additions and 23 deletions

View File

@@ -338,6 +338,31 @@ namespace BlackMisc
*/
void remove(const CCollection &other) { *this = CCollection(*this).difference(other); }
/*!
* \brief Remove elements for which a given predicate returns true.
* \pre The collection must be initialized.
* \return The number of elements removed.
*/
template <class Predicate>
int removeIf(Predicate p)
{
int count = 0;
for (auto it = begin(); it != end();)
{
if (p(*it)) { it = erase(it); count++; }
else { ++it; }
}
return count;
}
//! \copydoc BlackMisc::CContainerBase::removeIf
template <class K0, class V0, class... KeysValues>
int removeIf(K0 k0, V0 v0, KeysValues... keysValues)
{
// using-declaration doesn't play nicely with injected template names
return CCollection::CContainerBase::removeIf(k0, v0, keysValues...);
}
/*!
* \brief Test for equality.
*/