enh: ハッシュテーブルのclearメソッドの備考追加#1450
Conversation
|
⚡ プレビュー (HTML) (更新時刻: 2025-05-30 02:07:40 JST) 変更記事一覧
※ソース (.md) に直接変更のあった記事を列挙しています。グローバル修飾や変換規則の変更による変化は考慮していません。 |
|
あとこれは今回の PR に留まる話ではないですが、計算量が〇〇に比例するという表現は、ちょっと違和感があるかもです。改めて自身に問うてみると以下の2点がある気がします。
|
|
ぼくも比例という言い方には違和感がありますが、いい表現が思いつかないところではあります。 |
Co-authored-by: Akira Takahashi <faithandbrave@gmail.com>
計算量はバケット数をcとしてO(c)となる と言ったところでしょうか?少なくとも #1450 (comment) で述べられている問題点はクリアできていそうな気がします。 |
|
個人的には、規格には linear って書いてあるのだから素直に「線形」で良い気がしています: これが規格に一番忠実です。或いは線形というのは cpprefjp 読者に対して分かりにくいという配慮でしょうか。 |
良いと思います。 |
Co-authored-by: Koichi Murase <myoga.murase@gmail.com>
|
一旦ご指摘いただいた内容は全て反映しました |
Co-authored-by: Koichi Murase <myoga.murase@gmail.com>
|
コメントいただいたものは全て反映しました |
|
だいぶ煮詰まって固まってきた気配がするので読んでみました。 swap技法の紹介の部分ですが、これってvectorだと一見して非自明なのでshrink_to_fitが導入され、それでで行うべしとなったものですよね。 unordered_map/setコンテナについてswapによって同種のことが達成できるというのは、現状の備考のように記載いただいてもなお自明に理解できるものではない気がしており、 |
|
少し話が逸れてしまう気もするのですが、
とありますが、これだとtmpがスコープ抜けるまではメモリ解放されませんよね その観点で s = std::unordered_multiset<int>();の方が良い気がするし、現状記載されているswapによるやり方が「なお自明に理解できるものではない」問題も解消できると思いました |
s = decltype(s)();の方が綺麗かも |
|
void f(std::unordered_set<int>& s) {
s = std::unordered_set<int>(); // ok
//s = decltype(s)(); // error!
} |
|
decltypeは併記して紹介してもいいとは思いますが、リファレンスサイトなので明確であった方が読者に伝わりやすいという点でも、型は書いておくと安心感がありそうではあります。 それとすいません。
バケット列が完全に空というわけではないので、その点補足が必要そうです。。。 |
|
「バケット数を初期状態まで縮小させたい場合は、」みたいな感じでしょうか… |
|
「バケット数を初期状態まで縮小させたいときは、」と書き直し、 |
faithandbrave
left a comment
There was a problem hiding this comment.
忍耐強く対応していただいてありがとうございます。
私としては必要十分な内容になったと思いますので、あとは @akinomyoga さんのコメントに最後対応していただけたらマージできると思います。
Co-authored-by: Koichi Murase <myoga.murase@gmail.com>
|
いただいたご指摘には全て対応しました |
|
マージしましたー。 @math-hiyoko |
概要
close #1449
std:: unordered_setやstd:: unordered_mapをはじめとするハッシュテーブルのclearメソッドについて、その規格が定義する「計算量」(オブジェクトに対する操作の数)は本関数呼び出し前のコンテナの要素数に比例するものとされている。
しかし、GCC libstdc++, LLVM libc++ などの多くの実装では実行時間は概ね
bucket_count()+size()に比例する。#1449 (comment)
また、このメソッドはバケットのために確保された動的メモリを解放することを保障していない。
gccの実装: https://github.com/gcc-mirror/gcc/blob/fd50d2a24adaff9a9ba749fd0a1eb5a5c5ee35a8/libstdc%2B%2B-v3/include/bits/hashtable.h#L2707-L2720
clang LLVMの実装: https://github.com/llvm/llvm-project/blob/ad060dfa4c910e8253ba328be947ef70f6597326/libcxx/include/__hash_table#L1338-L1348
これを受けて、該当するメソッドの計算量に関する記述に備考を追加したものである