C++ 标准库类型之string

简介: C++ 标准库类型之string

string类型支持长度可变的字符串,C++标准库负责管理与存储字符相关的内存,以及提供各种操作。使用时必须包含头文件

#include<string>


using std::string;//如果使用using声明则编写更加简单

1.string对象的定义与初始化

string标准库支持几个构造函数。构造函数是一个特殊的成员函数,定义如何初始化该类型的对象。
string s1;//默认构造函数,s1为空串
string s2(s1);//初始化s2为s1的副本
string s3("value");//将s3初始化为一个字符串字面值的副本
string s4(n,'c');//将s4初始化为字符‘c’的n个副本

2.string对象的读写

#include<iostream>
#include <string>
using namespace std;
int main(){
    /*
    string cin>>s1 
    读取并忽略开头所有空白字符(如空格 换行 制表)
    读取字符直至再次遇到空白字符,读取终止
    如果输入的是"  hello world  " 那么输出的结果是"
    */
    string s1;
    cin >> s1;
    cout << s1 << endl;
    system("pause");
    return EXIT_SUCCESS;
}


2.1读入未知数目的string对象

string的输入操作符与内置数据类型的输入操作符一样 string的输入操作符也会返回所读的数据流,因此可以把输入操作符作为判断条件

string word;
    while (cin >> word){
        cout << word << endl;
    }

用输入操作符来读取string对象。该操作符返回所读的istream对象,并在读取结束后 ,作为while的判断条件。如果输入流是有效的,即未达到文件尾且未遇到无效输入,则执行while循环体,并将读取到的字符串输出到标准输出。如果达到了文件尾则跳出while循环。

2.2用getline读取整行文本

另外还有一个有用的string IO操作 getline 这个函数接受两个参数:一个输入流对象和一个string对象。getline函数从输入流的下一行读取,并保存读取的内容到string中,但不包括换行符。和输入操作不一样的是getline 并不忽略行开头的换行符,只要getline遇到换行符,即便是她输入的第一个字符getline也将停止并读入返回。如果第一个字符就是换行符,则string参数将被置为空。

 getline函数将istream参数作为返回值,和输入操作一样也把它用作判断条件。

while (getline(cin, word))
    {
        if (word.size() == 0)
            break;
        cout << word << endl;
    }

2.3 string对象的操作

string s;
    s.empty(); //如果s为空串 则返回true 否则返回false
    s.size();//返回s中字符个数
    //s[n];//返回s中位置为n的字符,位置从0开始计数
    //s1 + s2;//把s1与s2连接成一个新字符串,返回新生成的字符串
    //s1 = s2;把s1的内容替换为s2的副本
    //v1 == v2;比较v1和v2中的内容 相等返回true 否则返回false
    //!= , < , <= ;保持这些操作符惯有的含义
    //> 和<=

1.string 的size和empty操作

判断string对象是否为空一种方法就是判断s.size()==0,另一种就是s.empty()==true

2.string::size_type类型

从逻辑上讲size()成员函数似乎返回整形的数值,但是实际上返回的类型是string::size_type()类型的值

 string类类型和许多其他库都定义了一些配套类型(companion type)通过这些配套类型,库类型的使用就可以与机器无关(machine-independent)size_type就是这些配套类型中的一种,他定义为与unsigned(unsigned int,unsigned long)具有相同的含义,而且可以保证足够大能够存储任意string对象的长度。为了使由string类型定义的size_type类型,程序员必须加上作用于操作符来说明所使用的是由string类定义的。

3.string 关系操作符

== 操作符是比较两个string对象,如果它们相等,则返回true 两个string对象相等指的是他们的长度相同,且含有相同的字符。标准库还定义了!=操作符来测试两个string对象是否不等。

关系操作符采用的是大小写敏感的字典排序的策略

 + 如果两个string对象长度不同,且短的string对象与长的string对象的前面部分相匹配,则短的string对象小于长的对象

  + 如果两个对象的字符不同,则比较第一个比匹配的字符

4 string对象的赋值

总体上说,标准库类型尽量设计得和基本数据类型一样方便易用。因此大多数库类型支持赋值操作。对string对象来说 可以把一个string对象赋值给另一个string对象

string s1,s2="hello";

s1=s2;

赋值操作后,s1就包含了s2串所有字符的副本。

大多数string库类型的赋值等操作的实现都会遇到一些效率上的问题,值得注意的是,从概念上江,赋值操作确实需要做一些工作。必须先把s1占用的相关内存释放掉,然后再分配给s1足够存放s2副本的内存空间,最后把s2中的所有字符复制到新分配的内存空间。

5.两个string对象相加

string对象的加法被定义为连接concatenation,也就是说两个或多个string对象可以通过使用加操作符或者复合赋值操作符+=连接起来

string s1 = "hello";
string s2 = "world";
string s3 = s1+s2;
s1+=s2

6.和字符串面值的连接

当进行string对象和字符串面值混合连接操作时,+操作符的左右操作数必须至少有一个是string类型的,“这里猜测是string类型重载了+操作符”

所以有

string s1="nihao";
string s4 ="hello"+"world";这个是错误的
string s5=s1+"hello"+"world";这个是正确的
string s6 = "hello"+"wolrd"+s1; 这个也是错误的

 

7string对象获取字符

string类型可以通过下标操作符([])来访问string对象中的单词个数。下标操作符需要取一个size_type类型的值,来标明要访问字符的位置。这个下标中的值通常被称为下标或索引

8下标操作可用作左值

for(string::size_type ix=0;ix!=str.size();++ix){
str[ix] ='*';
}

9计算下标值

注意使用的过程中尽量使用string::size_type类型

2.4string对象中字符的处理

下列各种字符操作函数适用于string对象的字符,这些函数都位于cctype头文件中定义

isalnum(c) //如果c是字母或数字则为true
isalpha(c) //如果c是字母则返回true
iscntrl(c)//如果是控制字符则为true
isdigit(c)//如果c是数字 则为true
isgraph(c)//如果不是空格但可以打印 则为true
islower(c)如果c是小写字母 则为true
isprint(c)如果是可以打印的字符则为true
ispunct(c)//如果是标点符号则为true
isspace(c)如果是空白字符则为true
isupper(c)如果是大写字母 则为true
isxdigit(c)如果c是16进制则为true
tolower(c)如果是大写字母则返回其小写字母形式,否则直接返回c
toupper(c)如果是小写字母则返回其大写字母形式,否则直接返回c
目录
相关文章
|
2月前
|
算法 C++ 容器
C++标准库(速查)总结
C++标准库(速查)总结
76 6
|
20天前
|
C语言 C++ 容器
【c++丨STL】string模拟实现(附源码)
本文详细介绍了如何模拟实现C++ STL中的`string`类,包括其构造函数、拷贝构造、赋值重载、析构函数等基本功能,以及字符串的插入、删除、查找、比较等操作。文章还展示了如何实现输入输出流操作符,使自定义的`string`类能够方便地与`cin`和`cout`配合使用。通过这些实现,读者不仅能加深对`string`类的理解,还能提升对C++编程技巧的掌握。
45 5
|
20天前
|
存储 编译器 C语言
【c++丨STL】string类的使用
本文介绍了C++中`string`类的基本概念及其主要接口。`string`类在C++标准库中扮演着重要角色,它提供了比C语言中字符串处理函数更丰富、安全和便捷的功能。文章详细讲解了`string`类的构造函数、赋值运算符、容量管理接口、元素访问及遍历方法、字符串修改操作、字符串运算接口、常量成员和非成员函数等内容。通过实例演示了如何使用这些接口进行字符串的创建、修改、查找和比较等操作,帮助读者更好地理解和掌握`string`类的应用。
30 2
|
2月前
|
存储 程序员 C++
C++常用基础知识—STL库(2)
C++常用基础知识—STL库(2)
74 5
|
2月前
|
存储 安全 C++
【C++打怪之路Lv8】-- string类
【C++打怪之路Lv8】-- string类
25 1
|
2月前
|
存储 自然语言处理 程序员
C++常用基础知识—STL库(1)
C++常用基础知识—STL库(1)
69 1
|
2月前
|
数据可视化 Java
让星星月亮告诉你,通过反射创建类的实例对象,并通过Unsafe theUnsafe来修改实例对象的私有的String类型的成员属性的值
本文介绍了如何使用 Unsafe 类通过反射机制修改对象的私有属性值。主要包括: 1. 获取 Unsafe 的 theUnsafe 属性:通过反射获取 Unsafe类的私有静态属性theUnsafe,并放开其访问权限,以便后续操作 2. 利用反射创建 User 类的实例对象:通过反射创建User类的实例对象,并定义预期值 3. 利用反射获取实例对象的name属性并修改:通过反射获取 User类实例对象的私有属性name,使用 Unsafe`的compareAndSwapObject方法直接在内存地址上修改属性值 核心代码展示了详细的步骤和逻辑,确保了对私有属性的修改不受 JVM 访问权限的限制
60 4
|
2月前
|
C语言 C++
深度剖析C++string(中)
深度剖析C++string(中)
50 0
|
2月前
|
存储 编译器 程序员
深度剖析C++string(上篇)(2)
深度剖析C++string(上篇)(2)
39 0
|
3月前
|
Java 索引
java基础(13)String类
本文介绍了Java中String类的多种操作方法,包括字符串拼接、获取长度、去除空格、替换、截取、分割、比较和查找字符等。
44 0
java基础(13)String类