C++入门7——string类的使用-1

简介: C++入门7——string类的使用-1

1.什么是string类?

在官网中,string类有这样的介绍:

Strings are objects that represent sequences of characters.

即:string类表示的对象是字符串类。

1. string是表示字符串的字符串类

2. 该类的接口与常规容器的接口基本相同,再添加了一些专门用来操作string的常规操作。

3. string在底层实际是:basic_string模板类的别名,typedef basic_string string;

4. 不能操作多字节或者变长字符的序列。

(在使用string类时,必须包含#include头文件以及using namespace std;)

2.string类对象的常见构造

2.1 无参默认构造;

在官网中,对string();的解释为:

Constructs an empty string, with a length of zero characters.

即:构造一个空字符串,长度为零字符。

int main()
{
  //string();定义一个空的string类
  string s1;
  return 0;
}

2.2 通过字符串常量初始化;

在官网中,对于string (const char* s);的解释为:

Copies the null-terminated character sequence (C-string) pointed by s.

即:复制s指向的以空字符结尾的字符串。

int main()
{
  //string (const char* s);复制s指向的以空字符结尾的字符串
  string s2("hello world!");
  return 0;
}

2.3 拷贝构造;

在官网中,对string (const string& str);的解释为:

Constructs a copy of str.

即可以理解为拷贝构造。

int main()
{
    //拷贝构造s2
  string s3(s2);
  string s4 = s2;
  return 0;
}

2.4通过字符串子串初始化 ;

在官网中,对string (const string& str, size_t pos, size_t len = npos);的解释为:

Copies the portion of str that begins at the character position pos and spans len characters.

即:拷贝str从pos位置到len个字符的一部分。

int main()
{
    //string (const string& str, size_t pos, size_t len = npos);
  //拷贝str从pos位置到len个字符的一部分。
  string s5(s2, 1, 7);
  return 0;
}

可在官网里括号里还有一句话:  (or until the end of str, if either str is too short or if len is string::npos).

这句话可以理解为:如果str太短或者len太长,那就只拷贝到str的结尾。

2.5通过字符串前n个字符初始化;

在官网中,对string (const char* s, size_t n);的解释为:

Copies the first n characters from the array of characters pointed by s.

即:拷贝s指向的字符数组的前n个字符。

int main()
{
   //string (const char* s, size_t n);
  //拷贝s指向的字符数组的前n个字符
  string s6("hello world!", 5);
  return 0;
}

2.6 用n个字符c初始化字符串;

在官网中,对string (size_t n, char c);的解释为:

Fills the string with n consecutive copies of character c.

即:用n个C语言字符填充。

int main()
{
    //string (size_t n, char c);
  //用n个C语言字符填充
  string s7(10, 'l');
}

2.7 验证:

<<与>>已实现重载,所以可以直接用。

故验证代码如下:

#include<iostream>
#include<string>
using namespace std;
int main()
{
  //string();定义一个空的string类
  string s1;
 
  //string (const char* s);复制s指向的以空字符结尾的字符串
  string s2("hello world!");
 
  //string (const string& str);拷贝构造s2
  string s3(s2);
  string s3_1 = s2;
 
  //string (const string& str, size_t pos, size_t len = npos);
  //拷贝str从pos位置到len个字符的一部分。
  string s4(s2, 1, 7);//拷贝s2从下标1位置开始到7个字符的一部分
 
  //string (const char* s, size_t n);
  //拷贝s指向的字符数组的前n个字符
  string s5("hello world!", 5);//拷贝"hello world!"的前5个字符
 
  //string (size_t n, char c);
  //用n个C语言字符填充
  string s6(10, 'l');//拷贝10个‘l’
 
  cout << s1 << endl;
  cout << s2 << endl;
  cout << s3 << endl;
  cout << s3_1 << endl;
  cout << s4 << endl;
  cout << s5 << endl;
  cout << s6 << endl;
  return 0;
}

结果如图:

3.string类对象的遍历及访问

3.1 下标+ [] 访问

①计算string类的长度或大小

(size与length意义相同,建议用size)用法如下:

int main()
{
  string s1("hello world!");
  cout << s1.size() << endl;
  cout << s1.length() << endl;
  return 0;
}

(由结果得知,size与length不包含'\0')

② 知道了string的长度,我们就可以这样遍历string:

int main()
{
  string s1("hello world!");
  for (size_t i = 0; i < s1.size(); i++)
  {
    cout << s1[i] << endl;//重载了s1.operator[](i)
  }
  return 0;
}

③实现逆置string

方法一:手搓交换

int main()
{
  string s1("hello world!");
  cout << "逆置前s1="<< s1 << endl;
  size_t begin = 0;//左边界
  size_t end = s1.size() - 1;//右边界
  while (begin < end)
  {
    char tmp = s1[begin];
    s1[begin] = s1[end];
    s1[end] = tmp;
 
    ++begin;
    --end;
  }
  cout << "逆置后s1=" << s1 << endl;
  return 0;
}

方法二:使用swap

int main()
{
  string s1("hello world!");
  cout << "逆置前s1="<< s1 << endl;
  while (begin < end)
  {
    swap(s1[begin], s1[end]);
 
    ++begin;
    --end;
  }
  cout << "逆置后s1=" << s1 << endl;
  return 0;
}

3.2 iterator迭代器访问

int main()
{
  string s1("hello world!");
    string::iterator it = s1.begin();
  while (it != s1.end())
  {
    cout << *it << endl;
    ++it;
  }
  return 0;
}

iterator的用法与指针类似:

二者的区别:

下标+[]只适用于部分容器,底层物理有一定连续,如链式结构、树形、哈希结构,就只能用迭代器。迭代器才是容器访问的主流形式。

3.3 at访问

at访问与下标+[]访问的功能相同,区别主要体现在越界访问时的报错形式:

如①下标+[]的越界访问:

int main()
{
  string s1("hello world!");
  cout << s1[20] << endl;
  return 0;
}

②at的越界访问:

int main()
{
  string s1("hello world!");
  cout << s1.at(20) << endl;
  return 0;
}

(即下标+[]是暴力地终止,at是温柔地终止)



相关文章
|
18小时前
|
C++
C++番外篇——对于继承中子类与父类对象同时定义其析构顺序的探究
C++番外篇——对于继承中子类与父类对象同时定义其析构顺序的探究
27 1
|
19小时前
|
C语言 C++
C++番外篇——string类的实现
C++番外篇——string类的实现
9 0
|
19小时前
|
C++ 容器
C++入门7——string类的使用-2
C++入门7——string类的使用-2
10 0
|
2天前
|
安全 编译器 程序员
【C++篇】C++类与对象深度解析(六):全面剖析拷贝省略、RVO、NRVO优化策略
【C++篇】C++类与对象深度解析(六):全面剖析拷贝省略、RVO、NRVO优化策略
13 2
|
2天前
|
存储 C++
【C++篇】C++类和对象实践篇——从零带你实现日期类的超详细指南
【C++篇】C++类和对象实践篇——从零带你实现日期类的超详细指南
12 2
【C++篇】C++类和对象实践篇——从零带你实现日期类的超详细指南
|
1天前
|
编译器 C语言 C++
C++入门3——类与对象2-2(类的6个默认成员函数)
C++入门3——类与对象2-2(类的6个默认成员函数)
13 3
|
1天前
|
存储 编译器 C语言
C++入门2——类与对象1(类的定义和this指针)
C++入门2——类与对象1(类的定义和this指针)
10 2
|
2天前
|
安全 C语言 C++
【C++篇】探寻C++ STL之美:从string类的基础到高级操作的全面解析
【C++篇】探寻C++ STL之美:从string类的基础到高级操作的全面解析
23 4
|
1天前
|
编译器 C语言 C++
C++入门4——类与对象3-1(构造函数的类型转换和友元详解)
C++入门4——类与对象3-1(构造函数的类型转换和友元详解)
8 1
|
1天前
|
C++
C++番外篇——日期类的实现
C++番外篇——日期类的实现
10 1