diff --git a/reference/map/map/erase.md b/reference/map/map/erase.md index 868c9e440..84fe25a4f 100644 --- a/reference/map/map/erase.md +++ b/reference/map/map/erase.md @@ -5,13 +5,18 @@ * function[meta id-type] ```cpp -void erase(iterator position); // (1) C++03 -iterator erase(const_iterator position); // (1) C++11 +void erase(iterator position); // (1) C++03 (C++11で一旦削除) +iterator erase(iterator position); // (1) C++17 -size_type erase(const key_type& x); // (2) +iterator erase(const_iterator position); // (2) C++11 -void erase(iterator first, iterator last); // (3) C++03 -iterator erase(const_iterator first, const_iterator last); // (3) C++11 +size_type erase(const key_type& x); // (3) C++03 + +template +size_type erase(K&& x); // (4) C++23 + +void erase(iterator first, iterator last); // (5) C++03 +iterator erase(const_iterator first, const_iterator last); // (5) C++11 ``` ## 概要 @@ -20,8 +25,10 @@ iterator erase(const_iterator first, const_iterator last); // (3) C++11 これは削除された要素の数だけコンテナの `size` を減らし、それぞれの要素のデストラクタを呼び出す。 - (1) : 指定されたイテレータが指す要素を削除する -- (2) : 指定されたキーをもつ要素を削除する -- (3) : 指定されたイテレータ範囲の要素をすべて削除する +- (2) : 指定された読み取り専用イテレータが指す要素を削除する +- (3) : 指定されたキーをもつ要素を削除する +- (4) : `key_type`と比較可能な`K`型のキーを受け取って要素を削除する +- (5) : 指定されたイテレータ範囲の要素をすべて削除する ## パラメータ @@ -31,16 +38,20 @@ iterator erase(const_iterator first, const_iterator last); // (3) C++11 ## 戻り値 -- (1), (3) +- (1) : + - C++03 : 戻り値なし + - C++17 : 削除された要素の次を指すイテレータを返す。そのような要素がない場合、[`end()`](end.md)を返す (要素を削除した結果としてコンテナが空になった場合) +- (2) : 削除された要素の次を指すイテレータを返す。そのような要素がない場合、[`end()`](end.md)を返す (要素を削除した結果としてコンテナが空になった場合) +- (3), (4) : 削除された要素の数を返す +- (5) : - C++03 : 戻り値なし - C++11 : 削除された要素の次を指すイテレータを返す。そのような要素がない場合、[`end()`](end.md)を返す (要素を削除した結果としてコンテナが空になった場合) -- (2) 削除された要素の数を返す。 ## 計算量 -- (1) 定数時間。 -- (2) コンテナの [`size()`](/reference/map/map/size.md) について対数時間。 -- (3) コンテナの [`size()`](/reference/map/map/size.md) について対数時間、それに加えて `first` と `last` の間の距離に対する線形時間。 +- (1), (2) : 定数時間 +- (3), (4) : コンテナの [`size()`](/reference/map/map/size.md) について対数時間 +- (5) : コンテナの [`size()`](/reference/map/map/size.md) について対数時間、それに加えて `first` と `last` の間の距離に対する線形時間 ## 備考 @@ -174,7 +185,11 @@ int main() ## 参照 - [N2350 Container insert/erase and iterator constness (Revision 1)](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2350.pdf) + - C++11で、`erase(iterator)`を`erase(const_iterator)`に変更 - [LWG Issue 2258. `a.erase(q1, q2)` unable to directly return `q2`](http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#2258) - C++11では、「`a.erase(q1, q2)`の結果として`q2`が返る」という仕様だったが、`const_iterator`型が渡された場合に`iterator`型を返せない問題があった。そのためC++14では、`q2`が指す要素を指すイテレータが返る、ということが明記された - +- [LWG Issue 2059. C++0x ambiguity problem with `map::erase`](https://cplusplus.github.io/LWG/issue2059) + - C++17で、`erase(iterator)`を再追加 +- [P2077R3 Heterogeneous erasure overloads for associative containers](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2021/p2077r3.html) + - C++23で、`template erase(K&& x)`のオーバーロードが追加された diff --git a/reference/map/multimap/erase.md b/reference/map/multimap/erase.md index 2f45485d8..f52bcb6cf 100644 --- a/reference/map/multimap/erase.md +++ b/reference/map/multimap/erase.md @@ -5,13 +5,18 @@ * function[meta id-type] ```cpp -void erase(iterator position); // (1) C++03 -iterator erase(const_iterator position); // (1) C++11 +void erase(iterator position); // (1) C++03 (C++11で一旦削除) +iterator erase(iterator position); // (1) C++17 -size_type erase(const key_type& x); // (2) +iterator erase(const_iterator position); // (2) C++11 -void erase(iterator first, iterator last); // (3) C++03 -iterator erase(const_iterator first, const_iterator last); // (3) C++11 +size_type erase(const key_type& x); // (3) C++03 + +template +size_type erase(K&& x); // (4) C++23 + +void erase(iterator first, iterator last); // (5) C++03 +iterator erase(const_iterator first, const_iterator last); // (5) C++11 ``` @@ -21,9 +26,10 @@ iterator erase(const_iterator first, const_iterator last); // (3) C++11 これは削除された要素の数だけコンテナの `size` を減らし、それぞれの要素のデストラクタを呼び出す。 - (1) : 指定されたイテレータが指す要素を削除する -- (2) : 指定されたキーをもつ要素をすべて削除する -- (3) : 指定されたイテレータ範囲の要素をすべて削除する - +- (2) : 指定された読み取り専用イテレータが指す要素を削除する +- (3) : 指定されたキーをもつ要素をすべて削除する +- (4) : `key_type`と比較可能な`K`型のキーを受け取って要素をすべて削除する +- (5) : 指定されたイテレータ範囲の要素をすべて削除する ## パラメータ - `position` : `multimap` から削除する単一要素を指すイテレータ。`iterator` はメンバ型であり、双方向イテレータとして定義される。 @@ -32,16 +38,20 @@ iterator erase(const_iterator first, const_iterator last); // (3) C++11 ## 戻り値 -- (1), (3) +- (1) : + - C++03 : 戻り値なし + - C++17 : 削除された要素の次を指すイテレータを返す。そのような要素がない場合、[`end()`](end.md)を返す (要素を削除した結果としてコンテナが空になった場合) +- (2) : 削除された要素の次を指すイテレータを返す。そのような要素がない場合、[`end()`](end.md)を返す (要素を削除した結果としてコンテナが空になった場合) +- (3), (4) : 削除された要素の数を返す +- (5) : - C++03 : 戻り値なし - C++11 : 削除された要素の次を指すイテレータを返す。そのような要素がない場合、[`end()`](end.md)を返す (要素を削除した結果としてコンテナが空になった場合) -- (2) 削除された要素の数を返す。 ## 計算量 -- (1) 定数時間。 -- (2) コンテナの [`size()`](/reference/map/map/size.md) について対数時間。 -- (3) コンテナの [`size()`](/reference/map/map/size.md) について対数時間、それに加えて `first` と `last` の間の距離に対する線形時間。 +- (1), (2) : 定数時間 +- (3), (4) : コンテナの [`size()`](/reference/map/map/size.md) について対数時間 +- (5) : コンテナの [`size()`](/reference/map/map/size.md) について対数時間、それに加えて `first` と `last` の間の距離に対する線形時間 ## 備考 @@ -164,7 +174,10 @@ int main() ## 参照 - [N2350 Container insert/erase and iterator constness (Revision 1)](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2350.pdf) + - C++11で、`erase(iterator)`を`erase(const_iterator)`に変更 - [LWG Issue 2258. `a.erase(q1, q2)` unable to directly return `q2`](http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#2258) - C++11では、「`a.erase(q1, q2)`の結果として`q2`が返る」という仕様だったが、`const_iterator`型が渡された場合に`iterator`型を返せない問題があった。そのためC++14では、`q2`が指す要素を指すイテレータが返る、ということが明記された - - +- [LWG Issue 2059. C++0x ambiguity problem with `map::erase`](https://cplusplus.github.io/LWG/issue2059) + - C++17で、`erase(iterator)`を再追加 +- [P2077R3 Heterogeneous erasure overloads for associative containers](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2021/p2077r3.html) + - C++23で、`template erase(K&& x)`のオーバーロードが追加された diff --git a/reference/set/multiset/erase.md b/reference/set/multiset/erase.md index 4aed5f014..f8cd9641c 100644 --- a/reference/set/multiset/erase.md +++ b/reference/set/multiset/erase.md @@ -5,13 +5,18 @@ * function[meta id-type] ```cpp -void erase(iterator position); // (1) C++03 まで -iterator erase(const_iterator position); // (1) C++11 から +void erase(iterator position); // (1) C++03 (C++11で一旦削除) +iterator erase(iterator position); // (1) C++17 -void erase(iterator first, iterator last); // (2) C++03 まで -iterator erase(const_iterator first, const_iterator last); // (2) C++11 から +iterator erase(const_iterator position); // (2) C++11 -size_type erase(const key_type& x); // (3) +size_type erase(const key_type& x); // (3) C++03 + +template +size_type erase(K&& x); // (4) C++23 + +void erase(iterator first, iterator last); // (5) C++03 +iterator erase(const_iterator first, const_iterator last); // (5) C++11 ``` @@ -20,8 +25,10 @@ size_type erase(const key_type& x); // (3) これは削除された要素の数だけコンテナの [`size`](size.md)`()` を減らし、それぞれの要素のデストラクタを呼び出す。 - (1) : 指定されたイテレータが指す要素を削除する -- (2) : 指定されたキーをもつ要素をすべて削除する -- (3) : 指定されたイテレータ範囲の要素をすべて削除する +- (2) : 指定された読み取り専用イテレータが指す要素を削除する +- (3) : 指定されたキーをもつ要素をすべて削除する +- (4) : `key_type`と比較可能な`K`型のキーを受け取って要素をすべて削除する +- (5) : 指定されたイテレータ範囲の要素をすべて削除する ## パラメータ @@ -31,16 +38,20 @@ size_type erase(const key_type& x); // (3) ## 戻り値 -- (1), (2) : - - C++03 まで : なし +- (1) : + - C++03 : 戻り値なし + - C++17 : 削除された要素の次を指すイテレータを返す。そのような要素がない場合、[`end()`](end.md)を返す (要素を削除した結果としてコンテナが空になった場合) +- (2) : 削除された要素の次を指すイテレータを返す。そのような要素がない場合、[`end()`](end.md)を返す (要素を削除した結果としてコンテナが空になった場合) +- (3), (4) : 削除された要素の数を返す +- (5) : + - C++03 : 戻り値なし - C++11 : 削除された要素の次を指すイテレータを返す。そのような要素がない場合、[`end()`](end.md)を返す (要素を削除した結果としてコンテナが空になった場合) -- (3) : 削除された要素の数を返す。 ## 計算量 -- (1) : 定数時間 -- (2) : コンテナの [`size()`](size.md) についての対数時間と、それに加えて `first` と `last` の間の距離に対する線形時間。 -- (3) : コンテナの [`size()`](size.md) についての対数時間と、それに加えて `x` と等価なキーの要素数に対する線形時間。 +- (1), (2) : 定数時間 +- (3), (4) : コンテナの [`size()`](/reference/map/map/size.md) について対数時間 +- (5) : コンテナの [`size()`](/reference/map/map/size.md) について対数時間、それに加えて `first` と `last` の間の距離に対する線形時間 ## 備考 @@ -157,7 +168,10 @@ int main() ## 参照 - [N2350 Container insert/erase and iterator constness (Revision 1)](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2350.pdf) + - C++11で、`erase(iterator)`を`erase(const_iterator)`に変更 - [LWG Issue 2258. `a.erase(q1, q2)` unable to directly return `q2`](http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#2258) - C++11では、「`a.erase(q1, q2)`の結果として`q2`が返る」という仕様だったが、`const_iterator`型が渡された場合に`iterator`型を返せない問題があった。そのためC++14では、`q2`が指す要素を指すイテレータが返る、ということが明記された - - +- [LWG Issue 2059. C++0x ambiguity problem with `map::erase`](https://cplusplus.github.io/LWG/issue2059) + - C++17で、`erase(iterator)`を再追加 +- [P2077R3 Heterogeneous erasure overloads for associative containers](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2021/p2077r3.html) + - C++23で、`template erase(K&& x)`のオーバーロードが追加された diff --git a/reference/set/set/erase.md b/reference/set/set/erase.md index 1138910f9..683180d57 100644 --- a/reference/set/set/erase.md +++ b/reference/set/set/erase.md @@ -5,13 +5,18 @@ * function[meta id-type] ```cpp -void erase(iterator position); // (1) C++03 まで -iterator erase(const_iterator position); // (1) C++11 から +void erase(iterator position); // (1) C++03 (C++11で一旦削除) +iterator erase(iterator position); // (1) C++17 -void erase(iterator first, iterator last); // (2) C++03 まで -iterator erase(const_iterator first, const_iterator last); // (2) C++11 から +iterator erase(const_iterator position); // (2) C++11 -size_type erase(const key_type& x); // (3) +size_type erase(const key_type& x); // (3) C++03 + +template +size_type erase(K&& x); // (4) C++23 + +void erase(iterator first, iterator last); // (5) C++03 +iterator erase(const_iterator first, const_iterator last); // (5) C++11 ``` @@ -20,8 +25,10 @@ size_type erase(const key_type& x); // (3) これは削除された要素の数だけコンテナの [`size`](size.md)`()` を減らし、それぞれの要素のデストラクタを呼び出す。 - (1) : 指定されたイテレータが指す要素を削除する -- (2) : 指定されたキーをもつ要素を削除する -- (3) : 指定されたイテレータ範囲の要素をすべて削除する +- (2) : 指定された読み取り専用イテレータが指す要素を削除する +- (3) : 指定されたキーをもつ要素を削除する +- (4) : `key_type`と比較可能な`K`型のキーを受け取って要素を削除する +- (5) : 指定されたイテレータ範囲の要素をすべて削除する ## パラメータ @@ -31,16 +38,20 @@ size_type erase(const key_type& x); // (3) ## 戻り値 -- (1), (2) : - - C++03 まで : なし +- (1) : + - C++03 : 戻り値なし + - C++17 : 削除された要素の次を指すイテレータを返す。そのような要素がない場合、[`end()`](end.md)を返す (要素を削除した結果としてコンテナが空になった場合) +- (2) : 削除された要素の次を指すイテレータを返す。そのような要素がない場合、[`end()`](end.md)を返す (要素を削除した結果としてコンテナが空になった場合) +- (3), (4) : 削除された要素の数を返す +- (5) : + - C++03 : 戻り値なし - C++11 : 削除された要素の次を指すイテレータを返す。そのような要素がない場合、[`end()`](end.md)を返す (要素を削除した結果としてコンテナが空になった場合) -- (3) : 削除された要素の数を返す。 ## 計算量 -- (1) : 定数時間 -- (2) : コンテナの [`size()`](size.md) についての対数時間と、それに加えて `first` と `last` の間の距離に対する線形時間。 -- (3) : コンテナの [`size()`](size.md) について対数時間。 +- (1), (2) : 定数時間 +- (3), (4) : コンテナの [`size()`](/reference/map/map/size.md) について対数時間 +- (5) : コンテナの [`size()`](/reference/map/map/size.md) について対数時間、それに加えて `first` と `last` の間の距離に対する線形時間 ## 備考 @@ -158,7 +169,11 @@ int main() ## 参照 - [N2350 Container insert/erase and iterator constness (Revision 1)](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2350.pdf) + - C++11で、`erase(iterator)`を`erase(const_iterator)`に変更 - [LWG Issue 2258. `a.erase(q1, q2)` unable to directly return `q2`](http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#2258) - C++11では、「`a.erase(q1, q2)`の結果として`q2`が返る」という仕様だったが、`const_iterator`型が渡された場合に`iterator`型を返せない問題があった。そのためC++14では、`q2`が指す要素を指すイテレータが返る、ということが明記された - +- [LWG Issue 2059. C++0x ambiguity problem with `map::erase`](https://cplusplus.github.io/LWG/issue2059) + - C++17で、`erase(iterator)`を再追加 +- [P2077R3 Heterogeneous erasure overloads for associative containers](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2021/p2077r3.html) + - C++23で、`template erase(K&& x)`のオーバーロードが追加された