<html>
<head>
<TITLE>
ISO/IEC JTC1/SC22/WG21
N4273
</TITLE>
</head>
<body>
<h1>
<img align=top src="/pics/iso44.gif" alt="ISO/">
<img align=top src="/pics/iec44.gif" alt="IEC">
JTC1/SC22/WG21
N4273
</h1>
<pre>
Document number: N4273
Date: 2014-11-06
Project: Programming Language C++, Library Working Group
Reply-to: Stephan T. Lavavej &lt;stl@microsoft.com>


Uniform Container Erasure (Revision 2)


I. Introduction

This is a proposal to add erase_if(container, pred) and
erase(container, value), making it easier to eliminate unwanted elements
correctly and efficiently.  This updates <a hRef="../2014/n4161.htm">N4161</a> (see [2]) by removing the
overloads of erase() for associative containers and unordered associative
containers, adding a Note about the missing overloads, and updating
[general.feature.test].  The original proposal <a hRef="../2014/n4009.htm">N4009</a> (see [1]) explains
the rationale for this feature, which is not repeated here.


II. Standardese

1. In 1.3 [general.namespaces] Table 1 "C++ library headers", add:

&lt;experimental/deque>
&lt;experimental/forward_list>
&lt;experimental/list>
&lt;experimental/map>
&lt;experimental/set>
&lt;experimental/string>
&lt;experimental/unordered_map>
&lt;experimental/unordered_set>
&lt;experimental/vector>

2. In 1.5 [general.feature.test] Table 2 "Significant features in this
technical specification", add:

         Doc. No.: N4273
            Title: Uniform Container Erasure
  Primary Section: [container.erasure]
Macro Name Suffix: erase_if
            Value: 201411
           Header: &lt;experimental/vector>

3. Add a new section "Uniform container erasure" [container.erasure]
containing the following new sections.

4. Add a new section "Header synopsis" [container.erasure.syn] containing:

For brevity, this section specifies the contents of 9 headers, each of which
behaves as described by [general.namespaces].

namespace std {
namespace experimental {
inline namespace fundamentals_v2 {

  // [container.erasure.erase_if], function template erase_if
  // [container.erasure.erase], function template erase

  // &lt;experimental/string>
  template &lt;class charT, class traits, class A, class Predicate>
    void erase_if(basic_string&lt;charT, traits, A>& c, Predicate pred);
  template &lt;class charT, class traits, class A, class U>
    void erase(basic_string&lt;charT, traits, A>& c, const U& value);

  // &lt;experimental/deque>
  template &lt;class T, class A, class Predicate>
    void erase_if(deque&lt;T, A>& c, Predicate pred);
  template &lt;class T, class A, class U>
    void erase(deque&lt;T, A>& c, const U& value);

  // &lt;experimental/vector>
  template &lt;class T, class A, class Predicate>
    void erase_if(vector&lt;T, A>& c, Predicate pred);
  template &lt;class T, class A, class U>
    void erase(vector&lt;T, A>& c, const U& value);

  // &lt;experimental/forward_list>
  template &lt;class T, class A, class Predicate>
    void erase_if(forward_list&lt;T, A>& c, Predicate pred);
  template &lt;class T, class A, class U>
    void erase(forward_list&lt;T, A>& c, const U& value);

  // &lt;experimental/list>
  template &lt;class T, class A, class Predicate>
    void erase_if(list&lt;T, A>& c, Predicate pred);
  template &lt;class T, class A, class U>
    void erase(list&lt;T, A>& c, const U& value);

  // &lt;experimental/map>
  template &lt;class K, class T, class C, class A, class Predicate>
    void erase_if(map&lt;K, T, C, A>& c, Predicate pred);
  template &lt;class K, class T, class C, class A, class Predicate>
    void erase_if(multimap&lt;K, T, C, A>& c, Predicate pred);

  // &lt;experimental/set>
  template &lt;class K, class C, class A, class Predicate>
    void erase_if(set&lt;K, C, A>& c, Predicate pred);
  template &lt;class K, class C, class A, class Predicate>
    void erase_if(multiset&lt;K, C, A>& c, Predicate pred);

  // &lt;experimental/unordered_map>
  template &lt;class K, class T, class H, class P, class A, class Predicate>
    void erase_if(unordered_map&lt;K, T, H, P, A>& c, Predicate pred);
  template &lt;class K, class T, class H, class P, class A, class Predicate>
    void erase_if(unordered_multimap&lt;K, T, H, P, A>& c, Predicate pred);

  // &lt;experimental/unordered_set>
  template &lt;class K, class H, class P, class A, class Predicate>
    void erase_if(unordered_set&lt;K, H, P, A>& c, Predicate pred);
  template &lt;class K, class H, class P, class A, class Predicate>
    void erase_if(unordered_multiset&lt;K, H, P, A>& c, Predicate pred);

} // inline namespace fundamentals_v2
} // namespace experimental
} // namespace std

5. Add a new section "Function template erase_if" [container.erasure.erase_if]
containing:

template &lt;class charT, class traits, class A, class Predicate>
  void erase_if(basic_string&lt;charT, traits, A>& c, Predicate pred);
template &lt;class T, class A, class Predicate>
  void erase_if(deque&lt;T, A>& c, Predicate pred);
template &lt;class T, class A, class Predicate>
  void erase_if(vector&lt;T, A>& c, Predicate pred);
Effects: Equivalent to:
  c.erase(remove_if(c.begin(), c.end(), pred), c.end());

template &lt;class T, class A, class Predicate>
  void erase_if(forward_list&lt;T, A>& c, Predicate pred);
template &lt;class T, class A, class Predicate>
  void erase_if(list&lt;T, A>& c, Predicate pred);
Effects: Equivalent to:
  c.remove_if(pred);

template &lt;class K, class T, class C, class A, class Predicate>
  void erase_if(map&lt;K, T, C, A>& c, Predicate pred);
template &lt;class K, class T, class C, class A, class Predicate>
  void erase_if(multimap&lt;K, T, C, A>& c, Predicate pred);
template &lt;class K, class C, class A, class Predicate>
  void erase_if(set&lt;K, C, A>& c, Predicate pred);
template &lt;class K, class C, class A, class Predicate>
  void erase_if(multiset&lt;K, C, A>& c, Predicate pred);
template &lt;class K, class T, class H, class P, class A, class Predicate>
  void erase_if(unordered_map&lt;K, T, H, P, A>& c, Predicate pred);
template &lt;class K, class T, class H, class P, class A, class Predicate>
  void erase_if(unordered_multimap&lt;K, T, H, P, A>& c, Predicate pred);
template &lt;class K, class H, class P, class A, class Predicate>
  void erase_if(unordered_set&lt;K, H, P, A>& c, Predicate pred);
template &lt;class K, class H, class P, class A, class Predicate>
  void erase_if(unordered_multiset&lt;K, H, P, A>& c, Predicate pred);
Effects: Equivalent to:
  for (auto i = c.begin(), last = c.end(); i != last; ) {
    if (pred(*i)) {
      i = c.erase(i);
    } else {
      ++i;
    }
  }

6. Add a new section "Function template erase" [container.erasure.erase]
containing:

template &lt;class charT, class traits, class A, class U>
  void erase(basic_string&lt;charT, traits, A>& c, const U& value);
template &lt;class T, class A, class U>
  void erase(deque&lt;T, A>& c, const U& value);
template &lt;class T, class A, class U>
  void erase(vector&lt;T, A>& c, const U& value);
Effects: Equivalent to:
  c.erase(remove(c.begin(), c.end(), value), c.end());

template &lt;class T, class A, class U>
  void erase(forward_list&lt;T, A>& c, const U& value);
template &lt;class T, class A, class U>
  void erase(list&lt;T, A>& c, const U& value);
Effects: Equivalent to:
  erase_if(c, [&](auto& elem) { return elem == value; });

[ Note: Overloads of erase() for associative containers and
unordered associative containers are intentionally not provided. --end note ]


III. References

All of the Library Fundamentals v2 citations in this proposal are to
Working Draft <a hRef="../2014/n4084.html">N4084</a>:
<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4084.html
">http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4084.html</a>

[1] <a hRef="../2014/n4009.htm">N4009</a> "Uniform Container Erasure" by Stephan T. Lavavej:
<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4009.htm
">http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4009.htm</a>

[2] <a hRef="../2014/n4161.htm">N4161</a> "Uniform Container Erasure (Revision 1)" by Stephan T. Lavavej:
<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4161.htm
">http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4161.htm</a>

(end)
</pre>
</body>
</html>
