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是温柔地终止)



相关文章
|
1月前
|
编解码 Java 开发者
Java String类的关键方法总结
以上总结了Java `String` 类最常见和重要功能性方法。每种操作都对应着日常编程任务,并且理解每种操作如何影响及处理 `Strings` 对于任何使用 Java 的开发者来说都至关重要。
203 5
|
5月前
|
对象存储 C++ 容器
c++的string一键介绍
这篇文章旨在帮助读者回忆如何使用string,并提醒注意事项。它不是一篇详细的功能介绍,而是一篇润色文章。先展示重载函数,如果该函数一笔不可带过,就先展示英文原档(附带翻译),最后展示代码实现与举例可以直接去看英文文档,也可以看本篇文章,但是更建议去看英文原档。那么废话少说直接开始进行挨个介绍。
101 3
|
5月前
|
人工智能 机器人 编译器
c++模板初阶----函数模板与类模板
class 类模板名private://类内成员声明class Apublic:A(T val):a(val){}private:T a;return 0;运行结果:注意:类模板中的成员函数若是放在类外定义时,需要加模板参数列表。return 0;
132 0
|
5月前
|
存储 编译器 C语言
关于string的‘\0‘与string,vector构造特点,反迭代器与迭代器类等的讨论
你真的了解string的'\0'么?你知道创建一个string a("abcddddddddddddddddddddddddd", 16);这样的string对象要创建多少个对象么?你知道string与vector进行扩容时进行了怎么的操作么?你知道怎么求Vector 最大 最小值 索引 位置么?
114 0
|
5月前
|
存储 编译器 程序员
c++的类(附含explicit关键字,友元,内部类)
本文介绍了C++中类的核心概念与用法,涵盖封装、继承、多态三大特性。重点讲解了类的定义(`class`与`struct`)、访问限定符(`private`、`public`、`protected`)、类的作用域及成员函数的声明与定义分离。同时深入探讨了类的大小计算、`this`指针、默认成员函数(构造函数、析构函数、拷贝构造、赋值重载)以及运算符重载等内容。 文章还详细分析了`explicit`关键字的作用、静态成员(变量与函数)、友元(友元函数与友元类)的概念及其使用场景,并简要介绍了内部类的特性。
215 0
|
5月前
|
存储 安全 编译器
c++入门
c++作为面向对象的语言与c的简单区别:c语言作为面向过程的语言还是跟c++有很大的区别的,比如说一个简单的五子棋的实现对于c语言面向过程的设计思路是首先分析解决这个问题的步骤:(1)开始游戏(2)黑子先走(3)绘制画面(4)判断输赢(5)轮到白子(6)绘制画面(7)判断输赢(8)返回步骤(2) (9)输出最后结果。但对于c++就不一样了,在下五子棋的例子中,用面向对象的方法来解决的话,首先将整个五子棋游戏分为三个对象:(1)黑白双方,这两方的行为是一样的。(2)棋盘系统,负责绘制画面。
64 0
|
7月前
|
编译器 C++ 容器
【c++11】c++11新特性(上)(列表初始化、右值引用和移动语义、类的新默认成员函数、lambda表达式)
C++11为C++带来了革命性变化,引入了列表初始化、右值引用、移动语义、类的新默认成员函数和lambda表达式等特性。列表初始化统一了对象初始化方式,initializer_list简化了容器多元素初始化;右值引用和移动语义优化了资源管理,减少拷贝开销;类新增移动构造和移动赋值函数提升性能;lambda表达式提供匿名函数对象,增强代码简洁性和灵活性。这些特性共同推动了现代C++编程的发展,提升了开发效率与程序性能。
267 12
|
8月前
|
编译器 C++
类和对象(下)C++
本内容主要讲解C++中的初始化列表、类型转换、静态成员、友元、内部类、匿名对象及对象拷贝时的编译器优化。初始化列表用于成员变量定义初始化,尤其对引用、const及无默认构造函数的类类型变量至关重要。类型转换中,`explicit`可禁用隐式转换。静态成员属类而非对象,受访问限定符约束。内部类是独立类,可增强封装性。匿名对象生命周期短,常用于临时场景。编译器会优化对象拷贝以提高效率。最后,鼓励大家通过重复练习提升技能!
|
8月前
|
缓存 安全 Java
《从头开始学java,一天一个知识点》之:字符串处理:String类的核心API
🌱 **《字符串处理:String类的核心API》一分钟速通!** 本文快速介绍Java中String类的3个高频API:`substring`、`indexOf`和`split`,并通过代码示例展示其用法。重点提示:`substring`的结束索引不包含该位置,`split`支持正则表达式。进一步探讨了String不可变性的高效设计原理及企业级编码规范,如避免使用`new String()`、拼接时使用`StringBuilder`等。最后通过互动解密游戏帮助读者巩固知识。 (上一篇:《多维数组与常见操作》 | 下一篇预告:《输入与输出:Scanner与System类》)
186 11
|
8月前
|
Java
课时14:Java数据类型划分(初见String类)
课时14介绍Java数据类型,重点初见String类。通过三个范例讲解:观察String型变量、&quot;+&quot;操作符的使用问题及转义字符的应用。String不是基本数据类型而是引用类型,但使用方式类似基本类型。课程涵盖字符串连接、数学运算与字符串混合使用时的注意事项以及常用转义字符的用法。
203 9