| Summary: | false positives in container-anti-pattern | ||
|---|---|---|---|
| Product: | [Developer tools] clazy | Reporter: | Nyall Dawson <nyall.dawson> |
| Component: | general | Assignee: | Unassigned bugs <unassigned-bugs-null> |
| Status: | RESOLVED NOT A BUG | ||
| Severity: | normal | CC: | smartins |
| Priority: | NOR | ||
| Version First Reported In: | unspecified | ||
| Target Milestone: | --- | ||
| Platform: | Other | ||
| OS: | Linux | ||
| Latest Commit: | Version Fixed/Implemented In: | ||
| Sentry Crash Report: | |||
Your first example allocates once (due to keys() call), and it should allocate 0.
Use instead: for (auto it = someMap.cbegin(), end = someMap.cend(); it != end; ++it)
Your second example allocates twice (due to keys call) and it should allocate once, construct the set manually instead.
This is what happens when you call keys():
template <class Key, class T>
Q_OUTOFLINE_TEMPLATE QList<Key> QHash<Key, T>::keys() const
{
QList<Key> res;
res.reserve(size());
const_iterator i = begin();
while (i != end()) {
res.append(i.key());
++i;
}
return res;
}
You would be iterating twice instead of iterating the map directly.
I can update the README and make it more clear.
Ah, ok. I get it now... Thanks for the pointers! |
I'm just testing the new container-anti-pattern check and I get false positives for code like: Q_FOREACH ( int id, someMap.keys() ) { .... } and someMap.keys().toSet() I believe these are both false positives Reproducible: Always