C++ Primer学习--第三章 3.1命名空间的using声明,3.2 标准库类型string

本文介绍了C++ Primer中的命名空间using声明的使用,强调了不应在头文件中使用using声明以避免名字冲突。接着详细讲解了标准库类型std::string,包括初始化方式、size()函数、字符操作以及string对象的比较和相加。还提到了输入处理,如忽略空格和使用getline的区别,并讨论了处理string对象中字符的方法,如cctype库中的函数和基于范围的for循环。
摘要由CSDN通过智能技术生成

所有内容均为C++ Primer书中总结,欢迎指出错误

 

3.1 using声明

 

using声明可以调用声明其他命名空间中的对象,类。使用方法为

using std::cin;using std::cout;

这样在以后的代码中就可以直接用cin和cout来解决了。

这和python中调包很像

from keras.layers import Dense

注意这里的using声明不是直接使用整个using namespace。

一般不会在头文件中使用using 声明,这样可能会导致一些意想不到的名字冲突。

 

3.2 标准库类型 string

 

string类定义在<string>头文件中,定义一个类,需要构建它的 初始化方式以及在这个类上的操作。

对于初始化方式分类拷贝初始化和直接初始化,

string a="daqizi"; 
string b = a; 
string a;
string a("daqizi");
string a(10,'c'); 
string b(a);

以上的初始化方式,除了第1和2是拷贝初始化之外,其余的全是直接初始化,拷贝初始化就是通过=运算符,将=右边的值拷贝到等号左边.

注意在使用字符字面量初始化string对象时,字符串包含的内容不包括停止符。

string a = "123\0daqizi"; 
cout<<a; 
------ 
123 输出不会包含后续的daqizi

在这个类上的操作,除了可以通过函数进行操作之外,还可以通过定义运算符的新操作。

比如:

<< >> == = + != 这些在string类中都有定义。

关于输入

string a; cin>>a;//这种输入方式,会忽略掉前置和后置的空格, 
//且两个单词之间的空格也不会保留会被当做两个单词一起 
std::getline(cin,a)//这种输入方式不会忽略前置和后置的空格

关于size

string a = "123"; a.size()

size()返回的是size_type类型,它肯定是无符号整型,但是具体是什么类型,这是编译器要去处理的事情,我们只需要知道它是无符号类型就可以了。

因为size()返回的是无符号整型,切记无符号整型和有符号整型最好不要混用。

因为如果无符号整型所能表示的数的个数大于有符号整型所能表示的数的个数时(整型题设),

有符号整型会自动的转变为无符号整型,当有符号整型是负数的时候,转变为的无符号整型就很大。

string a="123"; int n=-1; 
if (a.size())>n{
 cout<<"yes";
 }else{ 
cout<<"no"; 
} 得到的值是no

 

string类比较大小是按照字典序来比较,比较的是第一次同一位置相异的字符的大小,这是和长度没有关系的。

string str="z";
string str1 = "abcdefg";

str要大于str1.

如果长度不同,且前面的字符都相等的话,则长度大的字符串要大于长度小的字符串。

如果两个字符串长度一样,且对应位置的字符都是相等的,则两个字符串相等。

 

关于string对象的相加

string a="123",b="123"; string c = a+b; 这是合法的 +号返回一个新的string对象

string的加号可以和字符字面量和字符串字面量一起混用,但是不能出现+号两边都是字符型或者字符串字面量的情况,因为C++由于历史原因,字符串字面值并不是string对象。

习题

3.2

string a;
while (std::getline(cin,a) ){
	//cout << a;
	cout << a << endl;
}
string a;
while (cin >> a) {
	cout << a << endl;
}

3.3

string的输入运算符会忽略前置和后置的空格,以及两个单词之间的空格

getline不会

3.4 

string a, b;
while (cin>>a>>b)
{
	cout << a <<"  "<< b<<endl;
	if (a.size()!=b.size()) {
		string temp = (a > b) ? a : b;
		cout <<temp <<endl;
	}
}
string a, b;
while (cin>>a>>b)
{
	cout << a <<"  "<< b<<endl;
	if (a.size()!=b.size()) {
		string temp = (a.size() > b.size()) ? a : b;
		cout <<temp <<endl;
	}
}

3.5 

略O(∩_∩)O

 

3.2.3 处理string对象中的字符

1. cctype文件中,包含了很多和字符相关的函数,不必硬记。

一般继承自c语言标准库的文件都用c开头,这些函数的命名空间都在std中,一般都使用c开头的头文件。

#include<cctype>

不推荐

#include<ctype.h>

ctype中的函数有

 

 

2. 基于范围的for可以遍历序列里面的所有元素

string a = "123asdfb";
for(auto temp:a){
    cout<<temp<<endl;
}

这和python里面的for循环方式很像

a:string = "sdlfjksadj"
for temp in a:
    print(a)

如果只处理字符串的一部分,则可以使用下标或者迭代器的方式

 

下标的方式:

下标运算符为[],其接收的参数类型为size_type,对于带符号的值,将自动转为size_type类型。

string a="123312";
a[1]='c'

切记不要越界,不然可能会引发,不可预知的后果

迭代的方式其实就是for循环,加使用下标

string a="12314123";
for(size_type index=0;index!=a.size();++index){
    
}

为什么使用size_type类型呢,因为size_type类型可以保证,其值永远是正的。所以无需担心其值是否小于0,只需要比较其值是否大于序列的长度。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值