clear() does not affect the result of capacity(). The standard's restriction on the changes to capacity is in the specification of reserve(), see SO.Isn't cppreference quite clear about what clear() does?Erases all elements from the container. After this call, size() returns zero.
Invalidates any references, pointers, and iterators referring to contained elements. Any past-the-end iterators are also invalidated.
it never specifies anything about releasing memory, or resetting values.
Best,
Rhidian
Op di 7 okt 2025 om 22:12 schreef Jerome Saint-Martin via Std-Proposals <std-proposals@lists.isocpp.org>:--MotivationIn the Standard Template Library (STL), theclear()function is defined for containers likestd::vector,std::deque, and others. Its behavior is functionally equivalent to:container.erase(container.begin(), container.end());
It removes all elements from the container, reducing itssize()to zero, but does not release memory (capacity remains unchanged), nor does it reset values. This leads to a subtle redundancy in the API:clear()is essentially a shorthand for a full-rangeerase().
ObservationWhileclear()is widely used and syntactically convenient, it introduces a semantic ambiguity. Many developers — especially those new to C++ — assumeclear()“resets” the container’s values. In reality, it destroys the elements, not reinitializes them.This confusion is compounded by the fact thatclear()does not offer anything beyond whaterase(begin(), end())already provides.
Too Much Progress Kills the ProgressIn the early days of programming, we usederase(begin(), end())like our ancestors used silex to make fire. It was precise, intentional, and part of the craft. Then cameclear()— a smoother, more modern tool. But in simplifying, we may have blurred its purpose. Today, we have expressive tools likeresize(n, val), ranges, and lambdas.Proposal
Option A (radical):
Deprecate or removeclear()from STL containers where it is strictly equivalent toerase(begin(), end()) reclaimclear()for a more meaningful role — resetting vector values to a default value, likeresize(n, val)does — and leterase(begin(), end())remain the sharp silex in our toolbox. Option B (soft): Clarify in the standard documentation thatclear()is a semantic alias forerase(begin(), end()), and does not reset values or release memory.
std::co_proposers :: Jérôme Saint-Martin and friend Beg Copilot
Std-Proposals mailing list
Std-Proposals@lists.isocpp.org
https://lists.isocpp.org/mailman/listinfo.cgi/std-proposals
--Rhidian De WitSoftware Engineer - Barco