关于string&vector

学术版

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 -O2basic_string常数略小。


by Killer_joke @ 2023-02-26 21:36:50

有个东西叫做 emplace_back (?)


by ud2_ @ 2023-02-26 21:40:24

@Killer_joke int 类型的 push_backemplace_back 没有区别。


by ud2_ @ 2023-02-26 22:15:02

@ppip 同样测试了对空容器进行 n 次 push_back,结论是在正整数范围内 n 越大 vectorbasic_string 越快。


by Pulsating_Dust @ 2023-02-26 22:19:16

@ppip

这个测试,有失偏颇,如果你不是使用5e7而是别的比如5.1e7 你会发现结果反过来了。

这是为什么呢

对于basic_string来说 它有一个初始化时创建的容量为 15/sizeof(T) 还有一个计算空间但不在容量中的最末位是标记用的空白元素

那么,在int情况下 basic_string的初始容量为3在您的测试中刚好少进行了一次内存分配。


| 下一页