String类(上)

简介: String类

> 作者简介:დ旧言~,目前大二,现在学习Java,c,c++,Python等

> 座右铭:松树千年终是朽,槿花一日自为荣。

> 目标:熟悉string库

> 毒鸡汤:人生就像一场旅行,不在乎目的地,而在乎沿途的风景以及看风景的心情。

> 望小伙伴们点赞👍收藏✨加关注哟💕💕

🌟前言

       学习这个板块可能有点头疼,因为太多的函数,学完都不知道学的是啥😅,正常。所以博主介绍一个学习c++的网站,这个网站也是c++创始人所写的🤔,方便大家学习c++,太良心啦🥰。

官网:cplusplus.com - The C++ Resources Network

⭐主体

       基于C语言的字符串,用起来是在复杂,稍不留神可能还会越界访问。为了操作方便,c++产生了string库,便于操作字符串。咱们就按照c++给的官网学习string库,具体分为六大板块,分别为:Member functions(成员函数),Iterators(迭代器),Capacity(容量),Element access(元素访问),Modifiers(修改器),String operations (字符串操作)☺️☺️☺️。

🌙Member functions(成员函数)

在这个板块中挺重要的,咱也不是全学,到时候可能真的就是从入门到放弃。

💫constructor(构造函数)

构造字符串对象,根据使用的构造函数版本初始化其值。

也就是说根据创建的string类来进行赋初始化。

  • str:另一个字符串对象,其值被复制或获取。
  • pos:str中作为子字符串复制到对象的第一个字符的位置。如果这大于str的长度,则抛出out_of_range。注意:str中的第一个字符由值0(而不是1)表示。
  • len:要复制的子字符串的长度(如果字符串较短,则复制尽可能多的字符)。字符串::npos的值表示str结束之前的所有字符。s

那咱们看看这个代码:

#include <iostream>
#include <string>
using namespace std;
int main()
{
    // 无参构造函数
    string s1();
    // 常量字符串构造函数
    string s2("hello world");
    cout << s2 << endl;
    // 拷贝构造函数
    string s3(s2);
    cout << s3 << endl;
    // 拷贝构造还可以写成下面这样子
    string s4 = s2;
    //初始化不够 11 > 9
    string s5("hello world", 9);
    cout << s5 << endl;
    return 0;
}

运行结果:

💫operator=(赋值函数)

为字符串指定一个新值,替换其当前内容。

这里提供了三种赋值函数:

  • 通过string对象赋值给string对象
  • 通过常量字符串赋值给string对象
  • 通过字符赋值给string对象。
#include <iostream>
#include <string>
using namespace std;
int main()
{
    //通过string对象赋值给string对象
    string s1("hello");
    string s2;
    s2 = s1;
    cout << s2 << endl;
    //通过常量字符串赋值给string对象
    s2 = "world";
    cout << s2 << endl;
    //通过字符赋值给string对象。
    s2 = 'C';
    cout << s2 << endl;
    return 0;
}

运行结果:

🌙Iterators(迭代器)

       我们在前面浅谈了迭代器,没有细说,今天有机会了😋,看着迭代器名字刁刁的,本质上还是一种遍历,像我们的for循环,典型的迭代器,咱们先看看最初我们用下标来访问遍历。

       string类是提供了[]运算符重载的,这也就意味着string可以让我们像访问数组一样利用下标来访问元素。

#include <iostream>
#include <string>
using namespace std;
int main()
{
    string s("hello world");
    for (size_t i = 0; i < s.size(); i++)
    {
        cout << s[i] << " ";
    }
    cout << endl;
    return 0;
}

运行结果:

💫利用begin和end实现迭代器

  • begin()函数返回的是string字符串的首位置
  • end()函数返回的是string字符串最后一个位置(即最后一个字符的下一个位置)

咱看看代码:

#include <iostream>
#include <string>
using namespace std;
int main()
{
    string str("hello world");
    string::iterator it = str.begin();
    while (it != str.end())
    {
        cout << *it;
        ++it;
    }
    cout << endl;
    return 0;
}

运行结果:

💫范围for实现迭代器

不知道小伙伴还记得auto关键字不,auto可以推导出元素属性(int,char)

咱们看看代码:

#include <iostream>
#include <string>
using namespace std;
int main()
{
    string s("hello world");
    for (auto ch : s)
    {
        cout << ch;
    }
    cout << endl;
    return 0;
}

运行结果:

💫反向迭代器

这里需要介绍一下rbegin()和rend()这两个函数,这两个函数是用来配合反向迭代器使用的。

  • rbegin()函数返回的是string字符串的最后一个有效字符
  • rend()函数返回的是string字符串的第一个字符的前一个位置。

咱们看看代码:

#include <iostream>
#include <string>
using namespace std;
int main()
{
    string s("hello world");
    string::reverse_iterator rit = s.rbegin();
    while (rit != s.rend())
    {
        cout << *rit;
        rit++;
    }
    cout << endl;
    return 0;
}

运行结果:

💫const修饰的迭代器

const修饰的迭代器是不可以改变的(只能读不能写)

咱们看看代码:

void Func(const string& s)
{
    string::const_iterator cit = s.begin();
    // 读操作
    while (cit != s.end())
    {
        cout << *cit;
        cit++;
    }
    cout << endl;
    // 不能进行写操作,会报错
    // cit = s.begin();
    // while (cit != s.end())
    // {
    //     (*cit) += 1;
    //     cout << *cit;
    //     cit++;
    // }
}

🌙Capacity(容量)

学习这个板块还是比较简单的,也运用比较广泛的一个板块。

💫size和length

size函数和length函数本质上是一样的,都是计算元素总个数的。

咱们看看代码:

#include <iostream>
#include <string>
using namespace std;
int main ()
{
    string s("hello world");
    cout << s.size() << endl;
    cout << s.capacity() << endl;
    return 0;
}

运行结果:

  • size是计算字符串的元素个数,除\0
  • capacity是计算字符串的容量,也就是说定义一个string类是有初始容量的

💫reserve和resize

reserve函数是扩容函数,可以增大capacity的值,

resize其实也是扩容函数,但resize改变的是size的值,当size的值增大时自动触发string的扩容机制从而也增大了capacity的值

resize在增带size值的时候还会对没有字符的位置初始化,如果没有指定初始化内容就默认初始化为’\0’,而reserve不会进行初始化。

咱们看看代码:

#include <iostream>
#include <string>
using namespace std;
int main()
{
    string s("hello");
    cout << s << endl;
    cout << "size:" << s.size() << endl;
    cout << "capacity:" << s.capacity() << endl;
    cout << endl;
    s.reserve(25);
    cout << s << endl;
    cout << "size:" << s.size() << endl;
    cout << "capacity:" << s.capacity() << endl;
    cout << endl;
    s.resize(50, 'A');
    cout << s << endl;
    cout << "size:" << s.size() << endl;
    cout << "capacity:" << s.capacity() << endl;
    cout << endl;
    return 0;
}

运行结果:

💫max_size

max_size函数是计算字符串可以达到的最大长度。

咱们看看代码:

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

运行结果:


String类(下):https://developer.aliyun.com/article/1389439

目录
相关文章
|
2月前
|
Java 索引
java基础(13)String类
本文介绍了Java中String类的多种操作方法,包括字符串拼接、获取长度、去除空格、替换、截取、分割、比较和查找字符等。
38 0
java基础(13)String类
|
3月前
|
API 索引
String类下常用API
String类下常用API
43 1
|
1月前
|
Java
【编程基础知识】(讲解+示例实战)方法参数的传递机制(值传递及地址传递)以及String类的对象的不可变性
本文深入探讨了Java中方法参数的传递机制,包括值传递和引用传递的区别,以及String类对象的不可变性。通过详细讲解和示例代码,帮助读者理解参数传递的内部原理,并掌握在实际编程中正确处理参数传递的方法。关键词:Java, 方法参数传递, 值传递, 引用传递, String不可变性。
51 1
【编程基础知识】(讲解+示例实战)方法参数的传递机制(值传递及地址传递)以及String类的对象的不可变性
|
27天前
|
安全 Java 测试技术
Java零基础-StringBuffer 类详解
【10月更文挑战第9天】Java零基础教学篇,手把手实践教学!
24 2
|
30天前
|
存储 安全 C++
【C++打怪之路Lv8】-- string类
【C++打怪之路Lv8】-- string类
21 1
|
1月前
|
数据可视化 Java
让星星月亮告诉你,通过反射创建类的实例对象,并通过Unsafe theUnsafe来修改实例对象的私有的String类型的成员属性的值
本文介绍了如何使用 Unsafe 类通过反射机制修改对象的私有属性值。主要包括: 1. 获取 Unsafe 的 theUnsafe 属性:通过反射获取 Unsafe类的私有静态属性theUnsafe,并放开其访问权限,以便后续操作 2. 利用反射创建 User 类的实例对象:通过反射创建User类的实例对象,并定义预期值 3. 利用反射获取实例对象的name属性并修改:通过反射获取 User类实例对象的私有属性name,使用 Unsafe`的compareAndSwapObject方法直接在内存地址上修改属性值 核心代码展示了详细的步骤和逻辑,确保了对私有属性的修改不受 JVM 访问权限的限制
49 4
|
2月前
|
安全 Java
String类-知识回顾①
这篇文章回顾了Java中String类的相关知识点,包括`==`操作符和`equals()`方法的区别、String类对象的不可变性及其好处、String常量池的概念,以及String对象的加法操作。文章通过代码示例详细解释了这些概念,并探讨了使用String常量池时的一些行为。
String类-知识回顾①
|
1月前
|
存储 安全 Java
【一步一步了解Java系列】:认识String类
【一步一步了解Java系列】:认识String类
24 2
|
1月前
|
安全 C语言 C++
【C++篇】探寻C++ STL之美:从string类的基础到高级操作的全面解析
【C++篇】探寻C++ STL之美:从string类的基础到高级操作的全面解析
33 4
|
1月前
|
存储 编译器 程序员
【C++篇】手撕 C++ string 类:从零实现到深入剖析的模拟之路
【C++篇】手撕 C++ string 类:从零实现到深入剖析的模拟之路
63 2

热门文章

最新文章