【C++】string类的使用②(容量接口Capacity )

简介: 这篇博客探讨了C++ STL中string的容量接口和元素访问方法。`size()`和`length()`函数等价,返回字符串的长度;`capacity()`提供已分配的字节数,可能大于长度;`max_size()`给出理论最大长度;`reserve()`预分配空间,不改变内容;`resize()`改变字符串长度,可指定填充字符。这些接口用于优化内存管理和适应字符串操作需求。

前言

本篇博客主要内容:STL库中string的容量接口(Capacity)和四种元素获取方式(Element access)的介绍和使用

来到string类的使用第二篇,让我们接着上一篇来讲。

🔥容量接口(Capacity)

在这里插入图片描述

==size和length==

在这里插入图片描述
在这里插入图片描述
size_t size() const;
size_t length() const;
将这两个函数接口的功能完全相同,它们没有参数传递,只有一个返回值(且这个返回值是const类型,不能被改变),返回:string对象中串的长度

使用样例:

#include <iostream>
#include <string>
using namespace std;
int main()
{
   
   
    string str("Test string");
    // string::size
    cout << "字符串长度为" << str.size() << endl;

    // string::length
    cout << "字符串长度为" << str.length() << endl;
    return 0;
}

在这里插入图片描述
至于为什么设计了两个功能相同的函数,这就牵扯到STL的发展史了。string是STL库中最早被实现的内容之一,当时获取字符串长度的时候只有length,并没有size。但随着STL的发展,陆续出现了vector,list,stack,queue这样的容器,在获取他们的元素个数时,使用的接口函数名用length(长度)似乎不太合适,于是选用了size(大小),string为了和别的容器保持一致,不得已也给自己加了一个size上去。

==capacity==

在这里插入图片描述
size_t capacity() const;
返回值:当前string对象中给串分配的字节数

这个分配的容量不一定和string的长度(length)相等,它可以等于或大于length的大小,它额外的空间可以优化对象往串中增加字符时的操作。如果string的容量(capacity)和串的长度(length)相等的话,那么当你向string对象的串中增加字符时,会导致每次的增加操作都会重新让存储串的空间扩一次容。

#include <iostream>
#include <string>
using namespace std;
int main()
{
    
    
    string str("Test string");
    cout << "size: " << str.size() << "\n";
    cout << "length: " << str.length() << "\n";
    cout << "capacity: " << str.capacity() << "\n";
    return 0;
}

在这里插入图片描述
如果看过我之前数据结构部分的内容,其实就不难理解capacity和length之间的区别。
可以看看我之前数据结构的这篇:初阶数据结构---顺序表和链表(C语言),里面capacity和size的道理和这里相同。

==max_size==

在这里插入图片描述
size_t max_size() const;
返回值:string可以开辟的最大长度

使用案例:

// comparing size, length, capacity and max_size
#include <iostream>
#include <string>
using namespace std;
int main()
{
   
   
    string str("Test string");
    cout << "size: " << str.size() << "\n";
    cout << "length: " << str.length() << "\n";
    cout << "capacity: " << str.capacity() << "\n";
    cout << "max_size: " << str.max_size() << "\n";
    return 0;
}

在这里插入图片描述
你可能会感叹,string竟然可以开这么大。可max_size的大小简单计算一下,已经有两个G了。计算机其实开不了这么大,其中涉及到很多别的因素。而且在coding中基本上也想不到用这个,所以此函数实际没什么作用。

==reserve==

在这里插入图片描述
void reserve (size_t n = 0);
这是改变string对象capacity大小的一个命令,能将capacity的大小改变使其大于等于n

如果n比当前对象的capacity大,则这个函数会将string对象扩容至大于等于n。
当n小于capacity时,这个行为是为被C++标准定义的,具体行为取决于编译器:

  1. 一种编译器(如VS),会选择无视这条命令,cpacity保持原来的大小。
  2. 另一种编译器(Linux下的g++),比较听话,会将string对象缩容使capacity等于n。

这个接口函数不会改变string串中的内容和length的大小

无返回值

使用样例:

#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main()
{
   
   
    string str("hello world");
    cout << str.length() << endl;
    cout << str.capacity() << endl;
    cout << endl;

    str.reserve(100);

    cout << str.length() << endl;
    cout << str.capacity() << endl;
    return 0;
}

在这里插入图片描述

==resize==

在这里插入图片描述
void resize (size_t n);
void resize (size_t n, char c);
将string对象的length改变为n

如果n小于当前string对象的length,那么string对象的串将被缩短,超出n部分的内容会被移除。
如果n大于当前string对象的length,如果没有提供第二个参数c,阔出来的新内容将会被'\0'填充;否则会被第二个参数“字符c”填充。

当n大于capacity的时候,string对象也会被扩容,使capacity增加至大于等于n

无返回值

使用样例:

// resizing string
#include <iostream>
#include <string>
using namespace std;
int main()
{
   
   
    string str("hello world");
    cout << str << endl;
    size_t sz = str.length();

    str.resize(sz + 4, 'x');
    cout << str << endl;

    // '\0'表示空,不会被打印
    str.resize(sz + 5);
    cout << str << endl;

    str.resize(sz);
    cout << str << endl;
    return 0;
}

在这里插入图片描述

相关文章
|
2天前
|
C语言 C++
【C++】string模拟实现(下)
本文档介绍了自定义`string`类的一些关键功能实现,包括`reserve()`用于内存管理,`push_back()`和`append()`添加字符或字符串,运算符`+=`的重载,以及`insert()`, `erase()`进行插入和删除操作。此外,还涵盖了`find()`查找函数,字符串的比较运算符重载,`substr()`获取子串,`clear()`清除内容,以及流插入和提取操作。常量`npos`用于表示未找到的标记。文档以代码示例和运行结果展示各功能的使用。
|
2天前
|
编译器 程序员 C语言
【C++】string模拟实现
这篇博客探讨了自定义实现C++ `string` 类的关键功能,包括构造、拷贝构造、赋值运算符重载及析构函数。作者强调了理解并实现这些功能对于面试的重要性。博客介绍了`string` 类的头文件`string.h`,其中定义了迭代器、基本成员函数如`swap()`、`size()`、`c_str()`等,并提到了深拷贝概念。此外,还展示了构造函数、析构函数和赋值运算符的实现,以及迭代器的定义与使用。博客还包括对C语言字符串函数的引用,以辅助读者理解实现细节。
|
2天前
|
编译器 C++
【C++】string类的使用④(字符串操作String operations )
这篇博客探讨了C++ STL中`std::string`的几个关键操作,如`c_str()`和`data()`,它们分别返回指向字符串的const char*指针,前者保证以&#39;\0&#39;结尾,后者不保证。`get_allocator()`返回内存分配器,通常不直接使用。`copy()`函数用于将字符串部分复制到字符数组,不添加&#39;\0&#39;。`find()`和`rfind()`用于向前和向后搜索子串或字符。`npos`是string类中的一个常量,表示找不到匹配项时的返回值。博客通过实例展示了这些函数的用法。
|
1天前
|
存储
数据存储之数组的特点,长度固定,适应变化需求,集合类特点是空间可变,ArrayList泛型,ArrayList<String> array = new ArrayList<String>()
数据存储之数组的特点,长度固定,适应变化需求,集合类特点是空间可变,ArrayList泛型,ArrayList<String> array = new ArrayList<String>()
|
2天前
|
C++
【C++】string类的使用④(常量成员Member constants)
C++ `std::string` 的 `find_first_of`, `find_last_of`, `find_first_not_of`, `find_last_not_of` 函数分别用于从不同方向查找目标字符或子串。它们都返回匹配位置,未找到则返回 `npos`。`substr` 用于提取子字符串,`compare` 则提供更灵活的字符串比较。`npos` 是一个表示最大值的常量,用于标记未找到匹配的情况。示例代码展示了这些函数的实际应用,如替换元音、分割路径、查找非字母字符等。
|
2天前
|
存储 C++
【C++】string类的使用③(非成员函数重载Non-member function overloads)
这篇文章探讨了C++中`std::string`的`replace`和`swap`函数以及非成员函数重载。`replace`提供了多种方式替换字符串中的部分内容,包括使用字符串、子串、字符、字符数组和填充字符。`swap`函数用于交换两个`string`对象的内容,成员函数版本效率更高。非成员函数重载包括`operator+`实现字符串连接,关系运算符(如`==`, `&lt;`等)用于比较字符串,以及`swap`非成员函数。此外,还介绍了`getline`函数,用于按指定分隔符从输入流中读取字符串。文章强调了非成员函数在特定情况下的作用,并给出了多个示例代码。
|
7天前
|
C++
【C++】日期类Date(详解)②
- `-=`通过复用`+=`实现,`Date operator-(int day)`则通过创建副本并调用`-=`。 - 前置`++`和后置`++`同样使用重载,类似地,前置`--`和后置`--`也复用了`+=`和`-=1`。 - 比较运算符重载如`&gt;`, `==`, `&lt;`, `&lt;=`, `!=`,通常只需实现两个,其他可通过复合逻辑得出。 - `Date`减`Date`返回天数,通过迭代较小日期直到与较大日期相等,记录步数和符号。 ``` 这是236个字符的摘要,符合240字符以内的要求,涵盖了日期类中运算符重载的主要实现。
|
2天前
|
C++
C++】string类的使用③(修改器Modifiers)
这篇博客探讨了C++ STL中`string`类的修改器和非成员函数重载。文章介绍了`operator+=`用于在字符串末尾追加内容,并展示了不同重载形式。`append`函数提供了更多追加选项,包括子串、字符数组、单个字符等。`push_back`和`pop_back`分别用于在末尾添加和移除一个字符。`assign`用于替换字符串内容,而`insert`允许在任意位置插入字符串或字符。最后,`erase`函数用于删除字符串中的部分内容。每个函数都配以代码示例和说明。
|
2天前
|
安全 编译器 C++
【C++】string类的使用②(元素获取Element access)
```markdown 探索C++ `string`方法:`clear()`保持容量不变使字符串变空;`empty()`检查长度是否为0;C++11的`shrink_to_fit()`尝试减少容量。`operator[]`和`at()`安全访问元素,越界时`at()`抛异常。`back()`和`front()`分别访问首尾元素。了解这些,轻松操作字符串!💡 ```
|
2天前
|
C++ 容器
【C++】string类的使用①(迭代器接口begin,end,rbegin和rend)
迭代器接口是获取容器元素指针的成员函数。`begin()`返回首元素的正向迭代器,`end()`返回末元素之后的位置。`rbegin()`和`rend()`提供反向迭代器,分别指向尾元素和首元素之前。C++11增加了const版本以供只读访问。示例代码展示了如何使用这些迭代器遍历字符串。