【C++】 —— string的使用(一)

简介: 【C++】 —— string的使用

前言

       string类虽然不在STL的容器中,但string类十分重要,string类是对字符串的存储和相关操作。

       basic_string

       std::basic_string类是C++的一个模版类,它支持多种字符类型。

  1. char :用于表示一个字节的字符,使用ASCII编码。
  2. wchar_t :用于表示宽字符,可以支持更广泛的字符集。
  3. char8_t :用于表示8位的Unicode字符(UTF-8)。
  4. char16_t :用于表示16位的Unicode字符(UTF-16)。
  5. char32_t :用于表示32位的Unicode字符(UTF-32)。

basic_string 实例化出来的4种类型:

string
wstring
u16string
u32string

       string类是basic_string模版类的一个实例,它使用char来实例化basic_string模版类,并使用char_traits和allocator 作为basic_string的默认参数。

一、string类

1、string类是表示字符序列的类。

2、标准的字符串类提供了对此对象的支持,其接口类似于标准字符容器的接口,但是添加了专门用于操作单字节字符字符串的设计特性。

3、string类封装了字符数组,并提供了一系列成员函数来执行字符串的创建、修改、连接、查找、替换等操作。

       string类出现实际上是比STL要早的,后来才分入STL库里面;所以,string一开始设计比较冗余,有很多重复功能的接口;我们没必要记住所有的接口,只需将核心接口记住并熟练使用就好啦;(如果遇到陌生的接口,直接查看文档就好了)。

string类文档

二、string默认成员函数

       2.1、构造函数

先来看一下C++库里面string的构造函数。

1、string();

       这是没有参数的构造函数(也就是默认构造函数),就是在创建string类对象时不需要传参数。

#include<iostream>
#include<string>
 
using namespace std;
void test()
{
  string s1;
}
 
int main()
{
  test();
  return 0;
}

2、string(const char* s);

       在创建string类对象时,传字符串(指针/字符数组),进行类对象的初始化。

使用:用字符串来初始化对象。

void test()
{
  string s1; //string();
  string s2("I Love You"); //string(const char* s);
}

3、string(const char* s, size_t n);

       与上面的构造函数不同的时,在传字符串指针的时,多一个参数n。

使用:用字符数组的前n个字符来初始化string类对象。

void test()
{
  string s1; //string();
  string s2("I Love You"); //string(const char* s);
  string s3("I Love You", 6); //string(const char* s, size_t n);
}

可以通过调试来看对象s1,s2,s3的值

4、string(const string& str);

       在创建string类对象,传同为string类类型的对象进行对象的初始化(也就是拷贝构造函数)。

使用:通过同类型的对象来初始化;

void test()
{
  string s1; //string();
  string s2("I Love You"); //string(const char* s);
  string s3("I Love You", 6); //string(const char* s, size_t n);
  string s4(s2); // string(const string& str);
}

5、string(const string& str, size_t pos, size_t len=npos);

       与拷贝构造不同的时,这个构造函数,还需要多传两个参数pos和len;

使用:用str中的第pos个位置后面len个字符进行初始化对象。

void test()
{
  string s1; //string();
  string s2("I Love You"); //string(const char* s);
  string s3("I Love You", 6); //string(const char* s, size_t n);
  string s4(s2); // string(const string& str);
  string s5(s2, 2, 4); //string(const string& str, size_t pos, size_t len=npos);
}

6、string(size_t n, char ch);

       创建string类对象,并将其内容设置成n个ch。

void test()
{
  string s1; //string();
  string s2("I Love You"); //string(const char* s);
  string s3("I Love You", 6); //string(const char* s, size_t n);
  string s4(s2); // string(const string& str);
  string s5(s2, 2, 4); //string(const string& str, size_t pos, size_t len=npos);
  string s6(6, 'H'); //string(size_t n, char ch);
}

7、

       C++文档中最后一个构造函数,涉及到迭代器,这里先不介绍,后面再使用。

       2.2、析构函数

       析构函数没有函数重载,就不过多叙述。

       2.3、赋值运算符重载

1、string& operator= (const string& str);

       使用:这个就是对于两个已经存在的string类类型对象,进行赋值操作。

void test1()
{
  string s1;
  string s2("Hello World");//拷贝构造
  s1 = s2;//赋值运算符重载
 
}

2、string& operator= (const char* s);

       使用:将一个字符串赋值给一个已经存在的string类类型对象。

void test1()
{
  string s1;
  string s2("Hello World");//拷贝构造
  s1 = s2;//赋值运算符重载
 
  string s3; 
  s3 = "I Love ";//operator= (const char* s);
}

3、string& operator= (char ch);

      使用:将一个字符赋值给一个已经存在的string类类型对象。

void test1()
{
  string s1;
  string s2("Hello World");//拷贝构造
  s1 = s2;//赋值运算符重载
 
  string s3; 
  s3 = "I Love ";//operator= (const char* s);
 
  string s4;
  s4 = 'c';//operator= (char ch);
}

调试看一下赋值结果:

三、string其他成员函数

       3.1、Capacity

这里就看几个常用的(size、lengh、resize、capacity、clear和empty)。

1、size*

       size就是返回string对象中的字符(数据)个数(也就是字符串的长度)。

2、lengh

       lengh和size一样,都是计算string对象中字符串的长度。

3、resize*

      resize是设置string对象中字符串的内容,(如果n要小于size就将字符串数据个数设为n)如果n大于size,(空间不够就扩容)设置size后面的字符内容。如果给了参数c就设置成 c;如果没有给参数c,就默认设置成'\0'。

4、capacity*

       capacity 返回string对象中可用空间的大小(就像动态顺序表中capacity一样)。

5、clear*

       clear是清理string中字符串的内容,让string对象中字符串变为空,并修改对象中size的值。

6、empty*

       empty判断string对象是否为空;为空就返回true,否则返回false。

7、reserve*

       

       reserve是设置string的空间大小,如果传参n比capacity大就扩容;如果小,不一定会缩小容量。

void test2()
{
  string s1("I Love You !!!");
  //size 返回s1中字符串数据个数
  cout << "size = " << s1.size() << endl;
  //lengh 返回s1中字符串长度
  cout << "lengh = " << s1.length() << endl;
  //capacity 返回s1中可用空间大小
  cout << "capacity = " << s1.capacity() << endl;
  //设置s1中数据个数
  s1.resize(10);
  cout << s1 << endl;
  s1.resize(20, 'x');
  cout << s1 << endl;
  //清理s1中字符串内容,使其变成空
  s1.clear();
  cout << s1 << endl;
  //empty 判断s1中字符串是否为空
  cout << s1.empty() << endl;
}

       3.2、Element access 数据访问

       Element access 就是元素访问,(访问字符串中的数据)。

       这里就主要看 operator[] 和at;

       除了这样访问元素,还可以通过迭代器就行访问(下面在迭代器内容进行使用)。

1、operator[]  *

       operator[] 库里面实现了两个,一个用于普通对象的元素访问(可读可写),另一个就用于const修饰的对象的元素访问(只读)。

       有了operator[] 这个运算符重载的函数,我们就可以像访问字符数组那样去通过下标访问string类型对象。

2、at

       at这个函数是传递一个参数pos,获得string对象中字符串下标为pos的字符。(使用起来和operator[]一样)。

void test3()
{
  string s1("Hello world");
  for (int i = 0; i < s1.size(); i++)
  {
    s1[i]++; //普通对象调用char& operator[](size_t pos); 可以进行修改
    cout << s1[i] << " ";
  }
  cout << endl;
  const string s2("Hello World");
  for (int i = 0; i < s2.size(); i++)
  {
    //s2[i]++; //err
    //const修饰的对象调用const char& operator[](size_t pos) cosnt; 不能进行修改
    cout << s2[i] << " ";
  }
  cout << endl << endl;
  string s3("Hello world");
  for (int i = 0; i < s3.size(); i++)
  {
    s3.at(i)++; //普通对象调用char& at(size_t pos); 可以进行修改
    cout << s3.at(i) << " ";
  }
  cout << endl;
  const string s4("Hello World");
  for (int i = 0; i < s4.size(); i++)
  {
    //s4.at[i]++; //err
    //const修饰的对象调用const char& at(size_t pos) cosnt; 不能进行修改
    cout << s4.at(i) << " ";
  }
  cout << endl;
 
}

       3.3、Modifiers

       Modifiers ,库里面提供了以下这些函数,对string对象中字符串进行设置(修改)

【C++】 —— string的使用(二)https://developer.aliyun.com/article/1621429

相关文章
|
5天前
|
C++ 容器
|
5天前
|
C++ 容器
|
5天前
|
C++ 容器
|
9天前
|
安全 C语言 C++
【C++篇】探寻C++ STL之美:从string类的基础到高级操作的全面解析
【C++篇】探寻C++ STL之美:从string类的基础到高级操作的全面解析
27 4
|
9天前
|
存储 编译器 程序员
【C++篇】手撕 C++ string 类:从零实现到深入剖析的模拟之路
【C++篇】手撕 C++ string 类:从零实现到深入剖析的模拟之路
41 2
|
10天前
|
编译器 C语言 C++
【C++】C++ STL 探索:String的使用与理解(三)
【C++】C++ STL 探索:String的使用与理解
|
10天前
|
存储 编译器 C++
【C++】C++ STL 探索:String的使用与理解(二)
【C++】C++ STL 探索:String的使用与理解
|
10天前
|
编译器 C语言 C++
【C++】C++ STL 探索:String的使用与理解(一)
【C++】C++ STL 探索:String的使用与理解
|
1天前
|
C语言 C++
深度剖析C++string(中)
深度剖析C++string(中)
5 0
|
1天前
|
存储 编译器 程序员
深度剖析C++string(上篇)(2)
深度剖析C++string(上篇)(2)
5 0