C++中的string容器容量操作

本文详细介绍了C++string容器的容量操作,包括size()和capacity()函数的使用、clear()清除数据、shrink_to_fit()缩容、reserve()预分配空间以及resize()调整大小,展示了string容器在内存管理中的灵活性和性能优化技巧。
摘要由CSDN通过智能技术生成

以string容器为例,有多个容量操作

string容器文档:string - C++ Reference (cplusplus.com)

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
  • 38
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

南林yan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值