ppip @ 2023-02-26 20:52:15
不少地方看到用string(实际为basic_string<T>)代替vector的。这两个实现不同吗?具体来说,string有什么有点?
by fengziyi @ 2023-02-26 20:53:15
@ppip vector 不是跑的更快么(O2 意义下)
by 5k_sync_closer @ 2023-02-26 20:55:09
@ppip string 功能更全一点吧。像 substr
by ppip @ 2023-02-26 21:00:20
@fengziyi 实测P5610一题basic_string更快
by ppip @ 2023-02-26 21:15:40
@ud2_ 能具体解释下『平凡标准类型』吗?另外,是否说明在作为邻接表方面basic_string永远更优秀(主要是更强大的功能,轻微更好的优化)?
by ud2_ @ 2023-02-26 21:27:57
@ppip 因为看不了代码没法验证猜想所以删除了回复;在一般(不卡常)题中对比测试时因为评测机波动所以没能得出结论。
平凡标准布局类型的定义。
by ppip @ 2023-02-26 21:30:44
@ud2_ P5610属于卡常题,不少讨论验证了这一点;另外本地进行了一系列的测试这里有pushback,确实 -std=c++14 -O2 下basic_string常数略小。
by Killer_joke @ 2023-02-26 21:36:50
有个东西叫做 emplace_back (?)
by ud2_ @ 2023-02-26 21:40:24
@Killer_joke int 类型的 push_back 和 emplace_back 没有区别。
by ud2_ @ 2023-02-26 22:15:02
@ppip 同样测试了对空容器进行 n 次 push_back,结论是在正整数范围内 n 越大 vector 比 basic_string 越快。
by Pulsating_Dust @ 2023-02-26 22:19:16
@ppip
这个测试,有失偏颇,如果你不是使用5e7而是别的比如5.1e7 你会发现结果反过来了。
这是为什么呢
对于basic_string来说 它有一个初始化时创建的容量为 15/sizeof(T) 还有一个计算空间但不在容量中的最末位是标记用的空白元素
那么,在int情况下 basic_string的初始容量为3在您的测试中刚好少进行了一次内存分配。