string类的相关知识及部分操作

文章目录

  • string对象的初始化
  • string::size_type类型
  • string对象的读写操作
    • 使用标准库中的iostream
    • 使用getline读取一整行
  • string对象的比较操作
  • string对象的相加操作
    • 两个string对象相加
    • 字面值和string对象相加


string对象的初始化

拷贝初始化(copy initialization):使用等号(=)初始化一个变量

直接初始化(direct initialization):不使用等号

当初始值只有一个时,使用两种初始化都行。如果用到的初始值有多个,一般来说只能使用直接初始化的方式:

string s5 = "hiya"; // 拷贝初始化
string s6("hiya); // 直接初始化
string s7(10, 'c'); //直接初始化

非要用拷贝初始化的方式来处理多个初始值也不是不可以,不过需要显式地创建一个(临时)对象用于拷贝:

string s8 = string(10, ' c');

等价于:

string temp(10, ' c');
string s8 = temp; // 将temp拷贝给s8

尽管初始化s8的语句合法,但和初始化s7的方式比较起来可读性较差,也没有任何补偿优势,因此不建议采用。



string::size_type类型

string::size_type类型是szie函数(例如:empty函数、size函数)返回值的类型。是一个无符号类型的值,而且足够存放下任何string对象的大小

所有用于存放string类的size函数返回值的变量,都应该是string::size_type类型的。

由于size函数返回的是一个无符号整型数,因此如果在表达式中混用了带符号数和无符号数将可能产生意想不到的结果。例如,假设n是一个具有负值的int,则表达式s.size()<n的判断结果几乎肯定是true。因为负值n会自动地转换成一个比较大的无符号值。

PS:如果一条表达式中已经有了size()函数就不要再使用int了,这样可以避免混用int和unsigned可能带来的问题。



string对象的读写操作

使用标准库中的iostream

执行读取操作时,string对象会自动忽略开头的空白(空格符、换行符、制表符等)并从第一个真正的字符开始读起,直到遇见下一处空白为止。

例如:如果程序输入:

     hello world        

则输出将是:

hello

输出结果中没有任何空格。


使用getline读取一整行

getline函数的参数是一个输入流和一个string对象,函数从给定的输入流中读入内容,直到遇到换行符为止(换行符也被读进来),然后把所读的内容存入到那个string对象中去(不存换行符)。

getline只要一遇到换行符就结束读取操作并返回结果,哪怕输入的一开始就是换行符也是如此。如果输入一开始就是换行符,那么所得的结果是个空string。

PS:触发getline函数返回的那个换行符实际上被丢弃掉了,得到的string对象中并不包含该换行符。



string对象的比较操作

string对象相等意味着它们的长度相同、所包含的字符也全都相同。

检验两个string对象之间关系的关系运算符都依照(大小写敏感的)字典顺序:

  1. 如果两个string对象的长度不同,而且较短的string对象的每个字符都与较长string对象对应位置上的字符相同,就说较短string对象小于较长string对象。
  2. 如果两个string对象在某些对应的位置上不一致,则string对象比较的结果其实是string对象中第一对相异字符比较的结果

举例:

string str = "Hello";
string phrase = "Hello World";
string slang = "Hiya";

根据规则1可判断,对象str小于对象phrase;根据规则2可判断,对象slang大于phrase,那么同理也大于str。



string对象的相加操作

两个string对象相加

两个string对象相加得到一个新的string对象,其内容是把左侧的运算对象与右侧的运算对象串接而成。

string s1 = "hello,", s2 = "world\n";
string s3 = s1 + s2;
//s3的内容是hello,world\n

字面值和string对象相加

因为标准库允许将字符字面值和字符串字面值转换成string对象,所以string对象可以用这两种字面值来替代。

 string s1 = "hello", s2 = "world";string s3 = s1 + "," + s2 + '\n';

当将string对象和字面值混在一条语句中使用时,必须确保每个加法运算符的两侧的对算对象至少有一个是string:

string s4 = s1 + ","; // 正确
string s5 = "hello" + ","; // 错误:两个运算对象都不是string
string s6 = s1 + "," + "world"; // 正确
string s7 = "hello" + "," + s2; // 错误

s6和s7的工作机理和连续输入连续输出是一样的,可以用如下形式分组:

string s6 = (s1 + ",") + "world"; 

其中子表达式s1 + ","的结果是一个string对象,同时作为第二个加法运算符的左侧运算对象,因此上述语句和下面的两个语句是等价的:

string tmp = s1 + ",";
s6 =  tmp + "world";

另一方面,s7的初始化是非法的,根据其语义加上括号后就成了下面的形式:

string s7 = ("hello" + ",") + s2;

很容易看到,括号内的子表达式试图把两个字符串字面值加在一起,而编译器根本没法做到这一点,所以这条语句是错误的。

PS:因为某些历史原因,也为了与C兼容,所以C++语言中的字符串字面值并不是标准库类型string对象。切记,字符串字面值和string是不同的类型。



本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/443834.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数组的部分练习

3.27&#xff1a;假设txt_size是一个无参数的函数&#xff0c;它的返回值是int。请回答下列哪个定义是非法的&#xff1f;为什么&#xff1f; unsigned buf_size1024; &#xff08;a&#xff09;int ia[buf_size];  &#xff08;b&#xff09;int ia[4*7-14]; &#xff08…

关于范围for语句的使用

文章目录使用范围for语句处理多维数组使用范围for语句处理多维数组 举个例子&#xff0c;使用范围for语句输出多维数组&#xff08;ia&#xff09;所有值&#xff1a; for (const auto &row : ia)for (auto col : row)cout << col << endl;本循环中并没有任何…

vector的应用练习

文章目录编写一段程序&#xff0c;使用条件运算符从vector< int >中找出哪些元素的值是奇数&#xff0c;然后将奇数值翻倍。 #include <iostream> #include <ctime> #include <vector> using namespace std; typedef int int_array[4]; int main() {v…

sizeof运算符运算结果小汇

文章目录sizeof运算符的结果部分地依赖于其作用的类型sizeof运算符的结果部分地依赖于其作用的类型 对char或者类型为char的表达式执行sizeof运算&#xff0c;结果得1对引用类型执行sizeof运算得到被引用对象所占空间的大小对指针执行sizeof运算得到指针本身所占空间的大小对解…

jQuery实现复选框的全选和反选:

jQuery实现复选框的全选和反选&#xff1a; 截图如下&#xff1a; 代码如下&#xff1a; index.jsp: <% page language"java" import"java.util.*" pageEncoding"UTF-8"%> <%String path request.getContextPath();String basePath…

C语言隐式/显式类型转换 | C++四种强制类型转换、类的隐式转换、explicit

文章目录C语言类型转换隐式类型转换显式类型转换C 强制类型转换static_castreinterpret_castconst_castdynamic_cast类的隐式类型转换概念只允许一步类类型转换explicit 抑制构造函数定义地隐式转换可以通过显式转换使用explicit构造函数C语言类型转换 隐式类型转换 编译器在…

string对象和C风格字符串

混用string对象和C风格字符串 我们都知道允许使用字符串字面值来初始化string对象&#xff1a; string s("Hello World!");C规定&#xff0c;任何出现字符串字面值的地方都可以用以空字符结束的字符数组来替代&#xff1a; 允许使用以空字符结束的字符数组来初始化…

函数重载、引用再探、内联函数

文章目录函数重载为什么C支持重载&#xff0c;C语言不支持呢&#xff1f;extern “C”引用再探引用的特性引用的使用场景引用和指针引用和指针的不同点:内联函数什么是内联函数&#xff1f;内联函数的特性内联函数的好处类的内联成员函数的声明内联函数的使用constexpr函数概念…

类的概念、成员函数的定义方式、类的访问控制和封装、类的大小、this指针

文章目录类的概念structclassclass和struct的区别是什么呢&#xff1f;类中成员函数的两种定义方式声明和定义都在类中声明和定义分离类的访问控制和封装类的封装特性类的大小结构体内存对齐规则类的存储方式this指针类的概念 在C中&#xff0c;类可以说是最重要的东西&#x…

jQuery实现两个列表框的值之间的互换:

jQuery实现两个列表框的值之间的互换&#xff1a; 截图如下&#xff1a; 代码如下&#xff1a; <% page language"java" import"java.util.*" pageEncoding"UTF-8"%> <%String path request.getContextPath();String basePath reque…

类的6个默认成员函数:构造函数、析构函数、拷贝构造函数、重载运算符、三/五法则

文章目录6个默认成员函数构造函数概念默认构造函数的类型默认实参概念默认实参的使用默认实参声明全局变量作为默认实参某些类不能依赖于编译器合成的默认构造函数第一个原因第二个原因第三个原因构造函数初始化构造函数里面的“”是初始化吗&#xff1f;为什么要使用列表初始化…

C++ 类的知识 | 构造函数再探、匿名对象、友元函数、内部类、类的const成员、类的static成员

文章目录构造函数再探以下代码共调用多少次拷贝构造函数委托构造函数概念形式匿名对象友元友元的声明友元类令成员函数作为友元函数重载和友元注意内部类特性类的const成员可变数据成员类的static成员概念关于static静态成员的类内初始化静态成员能用于某些普通成员不能的场景构…

截取全部数值字符并将其转化为数值类型

功能 从name中找出全部数值字符&#xff0c;之后将name&#xff08;string类&#xff09;转为d&#xff08;double类&#xff09; 代码 #include <iostream> #include <list> #include <deque> #include <vector> #include <forward_list> #i…

替换string中的部分字符

功能 向函数fun中传入三个参数&#xff1a;将s中所有oldval替换为newval 代码 #include <iostream> #include <list> #include <deque> #include <vector> #include <forward_list> #include <array> using namespace std;void fun(str…

顺序容器(vector、list、string、deque、forward_list)及迭代器、容器适配器

文章目录概述所有容器都支持的操作迭代器迭代器支持的操作迭代器支持的算术运算容器类型size_typeiterator 和 const_iterator容器定义和初始化拷贝初始化顺序容器独有的构造函数&#xff08;array除外&#xff09;array的初始化与内置数组类型的区别6种初始化方法&#xff08;…

jQuery实现表格隔行换颜色:

jQuery实现表格各行换颜色&#xff1a; 截图如下&#xff1a; 代码如下&#xff1a; <span style"font-family:Microsoft YaHei;font-size:14px;"><% page language"java" import"java.util.*" pageEncoding"UTF-8"%> &…

用stack处理中缀表达式【+、-、*、/、()】

文章目录题目描述思路使用getline()存储输入的字符串边读取边压栈完整代码题目描述 使用stack处理括号化的表达式。当你看到一个左括号&#xff0c;将其记录下来。当你在一个左括号之后看到一个右括号&#xff0c;从stack中pop对象&#xff0c;直至遇到左括号&#xff0c;将左括…

原地置换法寻找数组中重复的数

文章目录题目描述代码实现题目描述 在一个长度为 n 的数组 nums 里的所有数字都在 0&#xff5e;n-1 的范围内。数组中某些数字是重复的&#xff0c;但不知道有几个数字重复了&#xff0c;也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。 输入&#xff1a; [2,…

二维数组的查找

文章目录题目描述思路注意代码题目描述 在一个 n * m 的二维数组中&#xff0c;每一行都按照从左到右递增的顺序排序&#xff0c;每一列都按照从上到下递增的顺序排序。请完成一个高效的函数&#xff0c;输入这样的一个二维数组和一个整数&#xff0c;判断数组中是否含有该整数…

双指针

文章目录题目描述思路注意代码实现题目描述 请实现一个函数&#xff0c;把字符串 s 中的每个空格替换成"%20"。 示例 1&#xff1a; 输入&#xff1a;s “We are happy.” 输出&#xff1a;“We%20are%20happy.” 限制&#xff1a; 0 < s 的长度 < 10000 思…