admin管理员组文章数量:1612064
以string容器为例,有多个容量操作
string容器文档:string - C++ Reference (cplusplus)
1.求大小:size()
求容器大小使用 size(),string容器还可以使用 length()
(推荐使用siez(),因为string产生比STL更早,最初string类的求大小就是使用length(),后来STL诞生后string类被归并到STL中,开始使用size()求大小,size()更加统一、规范)
string s1("abcdefg");
cout << s1.size() << endl;
cout << s1.length() << endl;
2.求容量:capacity()
查看string的扩容机制
string s;
size_t sz = s.capacity();
for (size_t i = 0; i < 100; ++i)
{
s.push_back('c');
if (sz != s.capacity())
{
sz = s.capacity();
cout << "capacity changed" << " " << sz << endl;
}
}
3.清除数据:clear()
clear()只会清除数据,并不会清除原有的空间
string s1("abcdefg");
cout << "清除数据前" << endl;
cout << "数据:" << s1 << " " << "大小:" << s1.size() << " " << "容量:" << s1.capacity() << endl;
s1.clear();
cout << "清除数据后" << endl;
cout << "数据:" << s1 << " " << "大小:" << s1.size() << " " << "容量:" << s1.capacity() << endl;
4.缩容:shrink_to_fit()
shrink_to_fit默认缩容到最合适的容量(与扩容机制有关,缩容到与扩容机制最接近的容量,最小缩容到15)
string s1("abcdefghijklmnopqrst");
s1.clear();//清除数据
cout << "缩容前容量:" << s1.capacity() << endl;
s1.shrink_to_fit();
cout << "缩容后容量:" << s1.capacity() << endl;
5.扩容:reserve(size_t n = 0)
reserve()可以一次扩容到指定容量,容器的自动扩容需要扩容多次,每一次扩容都需要付出一定的代价(尤其是异地扩容),reserve()相比于容器的自动扩容效率更高。
使用reserve的前提是知道需要开辟多少空间
如果reserve()扩容的指定容量比现有容量小,编译器不会处理,只有当reserve()扩容的容量比现有容量大的时候才会处理
//一共需要扩容4次
string s;
size_t sz = s.capacity();
for (size_t i = 0; i < 100; ++i)
{
s.push_back('c');
if (sz != s.capacity())
{
sz = s.capacity();
cout << "capacity changed" << sz << endl;
}
}
//使用reserve一次扩容到100,总共只需要扩容一次
string s;
s.reserve(100);
size_t sz = s.capacity();
for (size_t i = 0; i < 100; ++i)
{
s.push_back('c');
if (sz != s.capacity())
{
sz = s.capacity();
cout << "capacity changed" << sz << endl;
}
}
6.扩充大小:resize(size_t n) / resize(size_t n, char c)
resize用于扩充size的大小
如果扩充的大小n小于size,会删除多余数据;n大于size小于capacity,会扩充size;n大于capacity会扩容+扩充size
如果未指定扩充内容,则默认扩充空字符(/0);指定扩充内容即用指定内容来扩充size
1.n小于size
string s("i miss gjj");
cout << "数据:" << s << " " << "大小:" << s.size() << " " << "容量:" << s.capacity() << endl;
s.resize(7);//n小于size
cout << "数据:" << s << " " << "大小:" << s.size() << " " << "容量:" << s.capacity() << endl;
//数据:i miss gjj 大小:10 容量:15
//数据:i miss 大小:7 容量:15
2.n大于size,小于capacity
//不指定扩充内容
string s("i miss gjj");
cout << "数据:" << s << " " << "大小:" << s.size() << " " << "容量:" << s.capacity() << endl;
s.resize(12);//n大于size,小于capacity
cout << "数据:" << s << " " << "大小:" << s.size() << " " << "容量:" << s.capacity() << endl;
//数据:i miss gjj 大小:10 容量:15
//数据:i miss gjj 大小:12 容量:15
//指定扩充内容
string s("i miss gjj");
cout << "数据:" << s << " " << "大小:" << s.size() << " " << "容量:" << s.capacity() << endl;
s.resize(12, '#');//n大于capacity
cout << "数据:" << s << " " << "大小:" << s.size() << " " << "容量:" << s.capacity() << endl;
//数据:i miss gjj 大小:10 容量:15
//数据:i miss gjj## 大小:12 容量:15
3.n大于capacity
//不指定扩充内容
string s("i miss gjj");
cout << "数据:" << s << " " << "大小:" << s.size() << " " << "容量:" << s.capacity() << endl;
s.resize(20);//n大于capacity
cout << "数据:" << s << " " << "大小:" << s.size() << " " << "容量:" << s.capacity() << endl;
//数据:i miss gjj 大小:10 容量:15
//数据:i miss gjj 大小:20 容量:31
//指定扩充内容
string s("i miss gjj");
cout << "数据:" << s << " " << "大小:" << s.size() << " " << "容量:" << s.capacity() << endl;
s.resize(20, '#');//n大于capacity
cout << "数据:" << s << " " << "大小:" << s.size() << " " << "容量:" << s.capacity() << endl;
//数据:i miss gjj 大小:10 容量:15
//数据:i miss gjj########## 大小:20 容量:31
版权声明:本文标题:C++中的string容器容量操作 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://www.elefans.com/xitong/1728622502a1166533.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论