basic_string的优点

Posted by wyj on April 18, 2020

我一年多之前就开始用basic_string替代vector了。现在我打算详细地讲解一下std::basic_string<T>相比std::vector<T>的优越之处。

速度

参考n方过十万对比,可以看出basic_string以微弱优势快于vector

语法糖

这个才是关键。首先,basic_string拥有vector拥有的几乎全部成员函数,比如说常用的push_backinserteraseresize等等。甚至释放内存函数shrink_to_fit也有。唯一缺少的是emplace系列,然而basic_string只能用来存放POD,所以说emplace并不可能给basic_string带来提速,没有存在的必要。

下面用几段C++代码来展示basic_string的方便之处。

basic_string<int> B={2,3,4};
vector<int> V={2,3,4};
// 相同的初始化列表构造能力
V.push_back(3);
B+=3;
// 最常用的操作:尾部增加元素,basic_string极其简短
V.insert(V.end(),{4,3,2});
B+={4,3,2};
// 次常用的操作:尾部添加多个元素,basic_string更加简短
struct edge{int v,w;};
basic_string<edge> Be[1<<18];
// basic_string也可以用来存放简单的结构体
for(int&i=cur[p];i<(int)V[p].size();i++){
	......
}
for(int i:B[p].substr(cur[p])){
	......
	cur[p]++;
}
// 当前弧优化,简短了很多
int p=V.size()*0.618;
rotate(V.begin(),V.begin()+p,V.end());

int pos=B.size()*0.618;
B=B.substr(p)+B.substr(0,p);
// 同样,使用substr和+实现简短的循环移位,也不需要强行记忆std::rotate的参数
for(int i:V)DoManyThingsWithI(i);
for(int i:V1)DoManyThingsWithI(i);

for(int i:B+B1)DoManyThingsWithI(i);
// 可以统一处理多个数组之内的数,而不需要声明临时变量
find(V.begin()+k,V.end(),3);
B.find(3,k);
B.find({4,3,2},k);
// 简短地查找某个元素,一样可以指定起始点,并且多出了查找子串的功能