リバースイテレータ談義

Codeforces #333終了後のTLです(後半、@tanakhさんのTLはARC #45直後のものです)。
0
koyumeishi @koyumeishi_

a.erase( a.rbegin() ) ってやると怒られるからrbegin嫌い

2015-11-25 04:22:54
koyumeishi @koyumeishi_

a.erase( (++a.rbegin()).base() )でできるっぽ

2015-11-25 04:27:50
ぷち@プログラマ日本一です @takapt0226

リバースイテレータでeraseできないの困ると思ってたけどbase()ってのがあるのか

2015-11-25 04:30:21
koyumeishi @koyumeishi_

a.rbegin().base() == a.end(); // true (++a.rbegin()).base() == --a.end(); // true みたいな関係にあるらしく、一つ動かさないといけないの面倒だ

2015-11-25 04:32:46
みさわ @Mi_Sawa

こうしないと, a.rend().base() が死ぬからかな.

2015-11-25 04:37:34
@purple_jwl

リバースイテレータ談義 - Togetterまとめ togetter.com/li/904604 @togetter_jpさんから

2015-11-25 07:47:52
agw @masashinakata

std::multiset<int> ms{1, 2, 3, 1, 2, 3}; ms.erase(std::prev(std::end(ms))); というソリューションを発見した(C++11から) stackoverflow.com/questions/1946…

2015-11-25 09:22:08
Hideyuki Tanaka @tanakh

multisetの罠って、eraseで値消したら全部消えるってんですかね?(´・_・`)

2015-12-13 22:44:56
Hideyuki Tanaka @tanakh

mapでmultisetやると、要素数0になったときにちゃんと消さないとめんどくさいし、ちゃんと消す処理入れるのもめんどいから、multiset便利なんだよな~(´・_・`)

2015-12-13 22:45:31
Hideyuki Tanaka @tanakh

ああ、あとmultisetの罠って言ったら、countが要素数多かったら重いっていうのかなあ。

2015-12-13 22:46:16
Hideyuki Tanaka @tanakh

ぶっちゃけstd::multisetのcountが要素数に比例してるくそみたいな実装になってる理由がよくわからんのだけどっ、なんでだろうなあ。

2015-12-13 22:46:45
Hideyuki Tanaka @tanakh

stdのred-black treeのノードに子ノードの個数持たせなければ効率よく実装できないし、countのためだけにそれやるのはよくないと言う判断かな~。でも子ノードの数持たせればindexアクセスもできたり便利なんだよな~。そういうmultisetもほしいな。

2015-12-13 22:47:56
Hideyuki Tanaka @tanakh

ms.erase(ms.find(v)) まあこうなるんだけどこれはこれでms.end()返した場合に死ぬからあれなんだよな~。いまいちインターフェースがかみ合ってないな~

2015-12-13 22:48:30