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
目录
相关文章
|
19天前
|
存储 C++ 容器
C++STL(标准模板库)处理学习应用案例
【4月更文挑战第8天】使用C++ STL,通过`std:vector`存储整数数组 `{5, 3, 1, 4, 2}`,然后利用`std::sort`进行排序,输出排序后序列:`std:vector<int> numbers; numbers = {5, 3, 1, 4, 2}; std:sort(numbers.begin(), numbers.end()); for (int number : numbers) { std::cout << number << " "; }`
19 2
|
8天前
|
存储 安全 C语言
【C++】string类
【C++】string类
|
存储 编译器 Linux
标准库中的string类(中)+仅仅反转字母+字符串中的第一个唯一字符+字符串相加——“C++”“Leetcode每日一题”
标准库中的string类(中)+仅仅反转字母+字符串中的第一个唯一字符+字符串相加——“C++”“Leetcode每日一题”
|
10天前
|
编译器 C++
标准库中的string类(上)——“C++”
标准库中的string类(上)——“C++”
|
17天前
|
C++
glog --- C++日志库
glog --- C++日志库
|
20天前
|
存储 算法 C语言
【C++初阶】8. STL初阶 + String类
【C++初阶】8. STL初阶 + String类
48 1
|
20天前
|
C语言 C++
【C++初阶】9. string类的模拟实现
【C++初阶】9. string类的模拟实现
38 1
|
25天前
|
XML JSON JavaScript
推荐一个比较好用的c++版本http协议库-cpp-httplib
推荐一个比较好用的c++版本http协议库-cpp-httplib
38 1
|
25天前
|
NoSQL C++
c++中包含string成员的结构体拷贝导致的double free问题
c++中包含string成员的结构体拷贝导致的double free问题
8 0
|
5天前
|
存储 编译器 C语言
c++的学习之路:5、类和对象(1)
c++的学习之路:5、类和对象(1)
19 0