【C++STL基础入门】string类的基础使用

简介: 【C++STL基础入门】string类的基础使用

前言


本系列文章使用VS2022,C++20版本

STL(Standard Template Library)是C++的一个强大工具集,其中的string类是STL中一个常用的容器。本文将介绍string类的基本使用方法。

1824b3f361c2454d8454f447f33bdc70.png


一、STL使用概述


在STL中,我们的每一个容器/string字符串等都是使用面向对象技术来实现的,我们只需要调用里面的函数即可完成任务。在使用过程中,我们需要using namespace std;这个才可以使用,然后添加对应的头文件。

比如像下面这个:

#include <string>
using namespace std;


如果你不想加下面这个,你可以这样写:

#include <string>
std::XXXXXX


XXXXX代表我们的类名,需要在前面加上std::


二、string类概述


tring类是STL中用于处理字符串的容器,提供了许多对字符串进行操作的方法,例如插入、删除、查找、替换等。它的特点在于可以动态地调整字符串的长度,而且内部实现了在内存中存储字符串的机制,屏蔽了底层细节。


1.string类的构造函数

  1. 无参构造string()
  2. string( size_type length, char ch );指定长度ch构造
  3. string( const char *str );字符串初始化构造
  4. string( const char *str, size_type length );str前几个进行构造
  5. string( string &str, size_type index, size_type length );str中间几个构造
  6. string(const string& str);拷贝构造


string输出

1.直接使用<<输出string就行了

2.使用c_str()函数返回const char *再输出


示例代码

#include <iostream>
#include <string>
int main() {
  // 1. 无参构造string()
  std::string str1;
  std::cout << "str1: " << str1 << std::endl;
  // 2. string(size_type length, char ch);指定长度ch构造
  std::string str2(5, 'A');
  std::cout << "str2: " << str2 << std::endl;
  // 3. string(const char *str);字符串初始化构造
  const char* cstr = "Hello, STL!";
  std::string str3(cstr);
  std::cout << "str3: " << str3 << std::endl;
  // 4. string(const char *str, size_type length);str前几个进行构造
  std::string str4(cstr, 5);
  std::cout << "str4: " << str4 << std::endl;
  // 5. string(string &str, size_type index, size_type length);str中间几个构造
  std::string str5(str3, 7, 3);
  std::cout << "str5: " << str5 << std::endl;
  // 6. string(const string& str);拷贝构造
  std::string str6(str3);
  std::cout << "str6: " << str6 << std::endl;
  return 0;
}


输出结果:

str1:

str2: AAAAA

str3: Hello, STL!

str4: Hello

str5: STL

str6: Hello, STL!

fd5cd3a5302d49859f4546ca58dac02b.png


2.string类属性

属性是什么

当我们谈论字符串时,可以将其视为一个字符序列。string类是C++中提供的用于操作字符串的类。它具有许多属性(也称为成员变量或数据成员),这些属性可以让我们更轻松地操作和管理字符串数据。

属性API

  1. capacity();函数返回一个整数,表示为字符串分配的内存空间的大小,即字符串对象的容量。它指的是当前字符串对象可以容纳的字符数的上限。通常情况下,容量大于或等于字符串的长度。该函数没有参数。
  2. reserve();函数用于预留字符串的内存空间,以便容纳指定数量的字符。它可以用来提前分配足够的内存,以避免频繁的内存重分配。 这个函数接受一个整数参数,表示要预留的新容量。
  3. length();函数用于预留字符串的内存空间,以便容纳指定数量的字符。它可以用来提前分配足够的内存,以避免频繁的内存重分配。 这个函数接受一个整数参数,表示要预留的新容量。
  4. size()函数返回一个整数,表示字符串的长度,即字符串中包含的字符的数量。与之类似的,length()函数也返回字符串的长度。这两个函数是等价的,可以根据个人的偏好来选择使用。
  5. resize():重新设置字符个数
  6. max_size()表示字符串对象可以达到的最大长度。这个值是由编译器和系统环境决定的。


示例代码

#include <iostream>
#include <string>
int main() {
    std::string str = "Hello World";
    // capacity()
    std::cout << "Capacity: " << str.capacity() << std::endl;
    // reserve()
    str.reserve(20);
    std::cout << "Capacity after reserve: " << str.capacity() << std::endl;
    // length() or size()
    std::cout << "Length: " << str.length() << std::endl;
    std::cout << "Size: " << str.size() << std::endl;
    // resize()
    str.resize(8);
    std::cout << "After resize: " << str << std::endl;
    return 0;
}


输出:

7f0de8a19d8245e3b43b16608794fb29.png

Capacity: 11
Capacity after reserve: 30
Length: 11
Size: 11
After resize: Hello Wo


3.输出

输出全部

1、使用<<运算符输出

2、使用函数c_str()返回const char *,然后打印

#include <iostream>
#include <string>
int main() {
    std::string str = "Hello, World!";
    // 使用 << 运算符输出
    std::cout << "Output using << operator: " << str << std::endl;
    // 使用 c_str() 函数返回 const char *
    const char* cstr = str.c_str();
    std::cout << "Output using c_str() function: " << cstr << std::endl;
    return 0;
}


输出结果:

Output using << operator: Hello, World!
Output using c_str() function: Hello, World!


输出单个字符

1、使用at(index)函数指定返回的字符,越界throw(out_of_range)

2、使用下标运算符[index]指定字符


示例代码:

#include <iostream>
#include <string>
int main() {
    std::string str = "Hello World";
    // 使用 at(index) 函数
    try {
        char ch = str.at(4);  // 获取索引为4的字符
        std::cout << "Character at index 4: " << ch << std::endl;
        // 越界访问
        char outOfRangeChar = str.at(20);  // 索引超出字符串长度,会抛出 std::out_of_range 异常
        std::cout << "Character at index 20: " << outOfRangeChar << std::endl;
    } catch (const std::out_of_range& e) {
        std::cerr << "Exception: " << e.what() << std::endl;
    }
    // 使用下标运算符 [index]
    char ch = str[2];  // 获取索引为2的字符
    std::cout << "Character at index 2: " << ch << std::endl;
    return 0;
}


输出结果:

Character at index 4: o
Exception: basic_string::at: __n (which is 20) >= this->size() (which is 11)
Character at index 2: l


总结


STL中的string类是一个强大且常用的容器,它提供了丰富的操作方法用于处理字符串。通过采用面向对象的方式实现,STL封装了底层的实现细节,提供了高效和便利的字符串操作接口。面向对象实现的好处包括封装性、可复用性和继承多态等,使得string类在实际应用中更加灵活和扩展性强。掌握STL的string类基础是C++开发的重要一步,通过深入理解其使用方法和面向对象的实现方式,可以更加高效地处理和操作字符串。

相关文章
|
3月前
|
缓存 算法 程序员
C++STL底层原理:探秘标准模板库的内部机制
🌟蒋星熠Jaxonic带你深入STL底层:从容器内存管理到红黑树、哈希表,剖析迭代器、算法与分配器核心机制,揭秘C++标准库的高效设计哲学与性能优化实践。
C++STL底层原理:探秘标准模板库的内部机制
|
3月前
|
编解码 Java 开发者
Java String类的关键方法总结
以上总结了Java `String` 类最常见和重要功能性方法。每种操作都对应着日常编程任务,并且理解每种操作如何影响及处理 `Strings` 对于任何使用 Java 的开发者来说都至关重要。
335 5
|
10月前
|
编译器 C++ 容器
【c++丨STL】基于红黑树模拟实现set和map(附源码)
本文基于红黑树的实现,模拟了STL中的`set`和`map`容器。通过封装同一棵红黑树并进行适配修改,实现了两种容器的功能。主要步骤包括:1) 修改红黑树节点结构以支持不同数据类型;2) 使用仿函数适配键值比较逻辑;3) 实现双向迭代器支持遍历操作;4) 封装`insert`、`find`等接口,并为`map`实现`operator[]`。最终,通过测试代码验证了功能的正确性。此实现减少了代码冗余,展示了模板与仿函数的强大灵活性。
286 2
|
10月前
|
存储 算法 C++
【c++丨STL】map/multimap的使用
本文详细介绍了STL关联式容器中的`map`和`multimap`的使用方法。`map`基于红黑树实现,内部元素按键自动升序排列,存储键值对,支持通过键访问或修改值;而`multimap`允许存在重复键。文章从构造函数、迭代器、容量接口、元素访问接口、增删操作到其他操作接口全面解析了`map`的功能,并通过实例演示了如何用`map`统计字符串数组中各元素的出现次数。最后对比了`map`与`set`的区别,强调了`map`在处理键值关系时的优势。
571 73
|
7月前
|
对象存储 C++ 容器
c++的string一键介绍
这篇文章旨在帮助读者回忆如何使用string,并提醒注意事项。它不是一篇详细的功能介绍,而是一篇润色文章。先展示重载函数,如果该函数一笔不可带过,就先展示英文原档(附带翻译),最后展示代码实现与举例可以直接去看英文文档,也可以看本篇文章,但是更建议去看英文原档。那么废话少说直接开始进行挨个介绍。
155 3
|
7月前
|
存储 编译器 C语言
关于string的‘\0‘与string,vector构造特点,反迭代器与迭代器类等的讨论
你真的了解string的'\0'么?你知道创建一个string a("abcddddddddddddddddddddddddd", 16);这样的string对象要创建多少个对象么?你知道string与vector进行扩容时进行了怎么的操作么?你知道怎么求Vector 最大 最小值 索引 位置么?
190 0
|
7月前
|
存储 安全 编译器
c++入门
c++作为面向对象的语言与c的简单区别:c语言作为面向过程的语言还是跟c++有很大的区别的,比如说一个简单的五子棋的实现对于c语言面向过程的设计思路是首先分析解决这个问题的步骤:(1)开始游戏(2)黑子先走(3)绘制画面(4)判断输赢(5)轮到白子(6)绘制画面(7)判断输赢(8)返回步骤(2) (9)输出最后结果。但对于c++就不一样了,在下五子棋的例子中,用面向对象的方法来解决的话,首先将整个五子棋游戏分为三个对象:(1)黑白双方,这两方的行为是一样的。(2)棋盘系统,负责绘制画面。
113 0
|
10月前
|
缓存 安全 Java
《从头开始学java,一天一个知识点》之:字符串处理:String类的核心API
🌱 **《字符串处理:String类的核心API》一分钟速通!** 本文快速介绍Java中String类的3个高频API:`substring`、`indexOf`和`split`,并通过代码示例展示其用法。重点提示:`substring`的结束索引不包含该位置,`split`支持正则表达式。进一步探讨了String不可变性的高效设计原理及企业级编码规范,如避免使用`new String()`、拼接时使用`StringBuilder`等。最后通过互动解密游戏帮助读者巩固知识。 (上一篇:《多维数组与常见操作》 | 下一篇预告:《输入与输出:Scanner与System类》)
293 11
|
10月前
|
存储 分布式计算 编译器
C++入门基础2
本内容主要讲解C++中的引用、inline函数和nullptr。引用是变量的别名,与原变量共享内存,定义时需初始化且不可更改指向对象,适用于传参和返回值以提高效率;const引用可增强代码灵活性。Inline函数通过展开提高效率,但是否展开由编译器决定,不建议分离声明与定义。Nullptr用于指针赋空,取代C语言中的NULL。最后鼓励持续学习,精进技能,提升竞争力。
|
10月前
|
存储 算法 C++
【c++丨STL】set/multiset的使用
本文深入解析了STL中的`set`和`multiset`容器,二者均为关联式容器,底层基于红黑树实现。`set`支持唯一性元素存储并自动排序,适用于高效查找场景;`multiset`允许重复元素。两者均具备O(logN)的插入、删除与查找复杂度。文章详细介绍了构造函数、迭代器、容量接口、增删操作(如`insert`、`erase`)、查找统计(如`find`、`count`)及`multiset`特有的区间操作(如`lower_bound`、`upper_bound`、`equal_range`)。最后预告了`map`容器的学习,其作为键值对存储的关联式容器,同样基于红黑树,具有高效操作特性。
456 3