最近又倒回去看了看之前学的没记笔记的知识。
学了string的皮毛以及范围for。
大部分我们用到的库函数都属于命名空间std,所以要了解关于命名空间的using声明。 我的理解是,举个例子,假如我们要使用cout与cin,
就算添加了库文件,不添加using声明,我们使用cout<<什么什么<<endl;这样编译器会报错,因为我们使用的名字不够完整,完整的名字为:
std::cout<<什么什么<<std::endl;这样的话,为了不这么繁琐,我们可以使用using声明,using std::cout;using std::endl;或者直接把整个std包含
进来,using namespace std; 这里注意:头文件不应该包含using声明。因为,头文件是要包含在别的文件去的,别的文件也许会声明using什么,
这样就会弄混。
string十个标准库类型,其中的学问很大,百度之后,就于拷贝赋值与直接赋值都有学问,因为我的愚笨,我就先记下一些皮毛的笔记。
<1>string的操作:
os<<s
is<<s 输入输出
getline(is,s) 从is中读取一行给s
s.empty() 判断s是否为空字符串
s.size() 返回s的字符串长度,类型为size_type
s[n] 下标方法,返回一个字符
s1 + s2字符串相加
s1 = s2 字符串赋值
s1 == s2 字符串比较,返回bool
s1 != s2 同上
<, <= , >, >= 利用字符在字典的顺序进行比较,对大小写敏感
<2>size_type
它是一个无符号类型,所有存放string的size函数返回值的变量,都是string::size_type类型,举个例子:加入n是一个具有负值的int,表达式s.size()<n的判断,结果几乎肯定是true,这是因为负值n会自动地转换成一个较大的无符号数。所以根据我自己的理解,在应用string或者其他会返回size_type,应该说可能会返回,尽量应用auto与decltype来定义这个类型,例如decltype(s.size()) c=0; 后面的笔记还会有例子。
<3>string相加
注意一个就是:C++中大部分的运算方式都是从左边到右边,string相加必须确保每个加法运算的两侧的运算至少要一个是string类型。例如:
string s4 =s1+","; 正确
string s5 = "hello" + "world"; 错误
string s6 = s1 + "," + "world"; 这里就是上面提到的,从左向右,可以堪称(s1+",")+"world";括号里相加还是string类型
string s7 = “hello" + "," +s1; 错误,道理如上
<4>string字符处理:
isalnum(c) 当c是字母或者数字的时候为真
isalpha(c) 当c是字母时候为真
iscntrl(c) 当c为控制字符时为真
isdigit(c) 当c为数字的时候为真
isgraph(c) 当c不是空格但是可以打印的时候为真
islower(c) 当c为小写的时候为真
isprint(c) 当c可以打印时候为真
ispunct(c) 当c为符号时候为真
isspace(c) 当c为空格时候为真
isupper(c) 当c为大写的时候为真
isxdigit(c) 当c为十六位进制数字时候为真
tolower(c) 当c为大写时候输出小写,当c为小写,输出本身。
toupper(c) 当c为小写时候输出大写,当c为大写输出本身。
例子:当输入abCD我要输出都为小写。这里可以while以及for配合下标或者迭代器,或者范围for,第五点就是范围for的概念。
<5>范围for
语法:for (declaration:expression){........}
declaration为一个变量,遍历expression中的每个元素。举个例子:
string s1 = "word";
for ( const auto c : s1)
{
cout<<c<<endl;
}得到结果就是
w
o
r
d
这就是范围for,《Effective C++》书里说尽量使用const,那么当我们要通过范围for来修改s1中的东西时候,应该使用引用。
string s2 = "world";
for ( auto &c : s2)
{
c=X;
}
结果会等于:
XXXXX