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



相关文章
|
28天前
|
C语言 C++ 容器
【c++丨STL】string模拟实现(附源码)
本文详细介绍了如何模拟实现C++ STL中的`string`类,包括其构造函数、拷贝构造、赋值重载、析构函数等基本功能,以及字符串的插入、删除、查找、比较等操作。文章还展示了如何实现输入输出流操作符,使自定义的`string`类能够方便地与`cin`和`cout`配合使用。通过这些实现,读者不仅能加深对`string`类的理解,还能提升对C++编程技巧的掌握。
67 5
|
28天前
|
存储 编译器 C语言
【c++丨STL】string类的使用
本文介绍了C++中`string`类的基本概念及其主要接口。`string`类在C++标准库中扮演着重要角色,它提供了比C语言中字符串处理函数更丰富、安全和便捷的功能。文章详细讲解了`string`类的构造函数、赋值运算符、容量管理接口、元素访问及遍历方法、字符串修改操作、字符串运算接口、常量成员和非成员函数等内容。通过实例演示了如何使用这些接口进行字符串的创建、修改、查找和比较等操作,帮助读者更好地理解和掌握`string`类的应用。
50 2
|
1月前
|
存储 编译器 C++
【c++】类和对象(下)(取地址运算符重载、深究构造函数、类型转换、static修饰成员、友元、内部类、匿名对象)
本文介绍了C++中类和对象的高级特性,包括取地址运算符重载、构造函数的初始化列表、类型转换、static修饰成员、友元、内部类及匿名对象等内容。文章详细解释了每个概念的使用方法和注意事项,帮助读者深入了解C++面向对象编程的核心机制。
103 5
|
1月前
|
存储 编译器 C++
【c++】类和对象(中)(构造函数、析构函数、拷贝构造、赋值重载)
本文深入探讨了C++类的默认成员函数,包括构造函数、析构函数、拷贝构造函数和赋值重载。构造函数用于对象的初始化,析构函数用于对象销毁时的资源清理,拷贝构造函数用于对象的拷贝,赋值重载用于已存在对象的赋值。文章详细介绍了每个函数的特点、使用方法及注意事项,并提供了代码示例。这些默认成员函数确保了资源的正确管理和对象状态的维护。
88 4
|
1月前
|
存储 编译器 Linux
【c++】类和对象(上)(类的定义格式、访问限定符、类域、类的实例化、对象的内存大小、this指针)
本文介绍了C++中的类和对象,包括类的概念、定义格式、访问限定符、类域、对象的创建及内存大小、以及this指针。通过示例代码详细解释了类的定义、成员函数和成员变量的作用,以及如何使用访问限定符控制成员的访问权限。此外,还讨论了对象的内存分配规则和this指针的使用场景,帮助读者深入理解面向对象编程的核心概念。
106 4
|
2月前
|
存储 编译器 对象存储
【C++打怪之路Lv5】-- 类和对象(下)
【C++打怪之路Lv5】-- 类和对象(下)
32 4
|
2月前
|
编译器 C语言 C++
【C++打怪之路Lv4】-- 类和对象(中)
【C++打怪之路Lv4】-- 类和对象(中)
32 4
|
2月前
|
存储 安全 C++
【C++打怪之路Lv8】-- string类
【C++打怪之路Lv8】-- string类
29 1
|
2月前
|
存储 编译器 C++
【C++类和对象(下)】——我与C++的不解之缘(五)
【C++类和对象(下)】——我与C++的不解之缘(五)
|
2月前
|
编译器 C++
【C++类和对象(中)】—— 我与C++的不解之缘(四)
【C++类和对象(中)】—— 我与C++的不解之缘(四)