C++学习笔记 联系客服

发布时间 : 星期日 文章C++学习笔记更新完毕开始阅读

Str[Str.length()] //未定义行为 Cstr[Cstr.length()] //返回 ‘\\0’ Str.at(Str.length());//throw out_of_range Cstr.at(Cstr.length()) ////throw out_of_range 我不赞成类似于下面的引用或指针赋值: char& r=s[2]; char* p= &s[3];

因为一旦发生重新分配,r,p立即失效。避免的方法就是不使用。

2.4比较函数

C ++字符串支持常见的比较操作符(>,>=,<,<=,==,!=),甚至支持string与C-string的比较(如 str<\。在使用>,>=,<,<=这些操作符的时候是根据\当前字符特性\将字符按字典顺序进行逐一得 比较。字典排序靠前的字符小,比较的顺序是从前向后比较,遇到不相等的字符就按这个位置上的两个字符的比较结果确定两个字符串的大小。同时,string (\。

另一个功能强大的比较函数是成员函数compare()。他支持多参数处理,支持用索引值和长度定位子串来进行比较。他返回一个整数来表示比较结果,返回值意义如下:0-相等 〉0-大于 <0-小于。举例如下: string s(\

s.compare(\返回0

s.compare(\返回一个小于0的值 s.compare(\返回大于0的值

s.compare(s); //相等

s.compare(0,2,s,2,2); //用\和\进行比较 小于零 s.compare(1,2,\用\和\比较。 后面有更个性化的比较算法。使用的是STL的比较算法。

2.5 更改内容

这在字符串的操作中占了很大一部分。

首先讲赋值,第一个赋值方法当然是使用操作符=,新值可以是string(如:s=ns) 、c_string(如:s=\甚至单一字符(如:s=’j’)。还可以使用成员函数assign(),这个成员函数可以使你更灵活的对字符串赋值。还是举例说明吧: s.assign(str); //不说

s.assign(str,1,3);//如果str是\就是把\赋给字符串 s.assign(str,2,string::npos);//把字符串str从索引值2开始到结尾赋给s s.assign(\不说

s.assign(\把’n’ ‘I’ ‘c’ ‘o’ ‘\\0’赋给字符串 s.assign(5,’x’);//把五个x赋给字符串

把字符串清空的方法有三个:s=\我越来越觉得举例比说话让别人容易懂!)。

string提供了很多函数用于插入(insert)、删除(erase)、替换(replace)、增加字符。 先说增加字符(这里说的增加是在尾巴上),函数有 +=、append()、push_back()。举例如下:

s+=str;//加个字符串

s+=\加个C字符串 s+=’a’;//加个字符

s.append(str);

s.append(str,1,3);//同前面的函数参数assign的解释 s.append(str,2,string::npos)

s.append(\s.append(\s.append(5,’x’);

s.push_back(‘a’);//这个函数只能增加单个字符 对STL熟悉的理解起来很简单

也许你需要在string中间的某个位置插入字符串,这时候你可以用insert()函数,这个函数

需要你指定一个安插位置的索引,被插入的字符串将放在这个索引的后面。 s.insert(0,\s.insert(1,str);

这 种形式的insert()函数不支持传入单个字符,这时的单个字符必须写成字符串形式(让人恶心)。既然你觉得恶心,那就不得不继续读下面一段话:为了插 入单个字符,insert()函数提供了两个对插入单个字符操作的重载函数:insert(size_type index,size_type num,chart c)和insert(iterator pos,size_type num,chart c)。其中size_type是无符号整数,iterator是char*,所以,你这么调用insert函数是不行的:insert(0,1, ’j’);这时候第一个参数将转换成哪一个呢?所以你必须这么写:

insert((string::size_type)0,1,’j’)!第二种形式指 出了使用迭代器安插字符的形式,在后面会提及。顺便提一下,string有很多操作是使用STL的迭代器的,他也尽量做得和STL靠近。

删除函数erase()的形式也有好几种,替换函数replace()也有好几个。举例吧: string s=\

s.replace(1,2,\从索引1开始的2个替换成后面的C_string s.erase(13);//从索引13开始往后全删除 s.erase(7,5);//从索引7开始往后删5个

2.6提取子串和字符串连接

题取子串的函数是:substr(),形式如下: s.substr();//返回s的全部内容 s.substr(11);//从索引11往后的子串 s.substr(5,6);//从索引5开始6个字符 把两个字符串结合起来的函数是+。

2.7输入输出操作

1.>> 从输入流读取一个string。 2.<< 把一个string写入输出流。

另一个函数就是getline(),他从输入流读取一行内容,直到遇到分行符或到了文件尾。

2.8搜索与查找

查找函数很多,功能也很强大,包括了: find() rfind() find_first_of() find_last_of() find_first_not_of() find_last_not_of()

这些函数返回符合搜索条件的字符区间内的第一个字符的索引,没找到目标就返回npos。所有的函数的参数说明如下:

第一个参数是被搜寻的对象。第二个参数(可有可无)指出string内的搜寻起点索引,第三个参数(可有可无)指出搜寻的字符个数。当然,更加强大的STL搜寻在后面会有提及。 最 后再说说npos的含义,string::npos的类型是string::size_type,所以,一旦需要把一个索引与npos相比,这个索引值必须是string::size_type类型的,更多的情况下,我们可以直接把函数和npos进行比较(如:if(s.find(\)。

容器----vector类+迭代器

Vector类(string类取代了char(字符串),vector类取代了数组,它可以放任何类型的数据,可以动态改变大小) 功能函数:(另外,迭代器相当于指针)#include using namespace std;(在该命名空间下)

c.clear() 移除容器中所有数据。 c.empty() 判断容器是否为空。 c.erase(pos) 删除pos位置的数据 c.erase(beg,end) 删除[beg,end)区间的数据 c.front() 传回第一个数据。

c.insert(pos,elem) 在pos位置插入一个elem拷贝 c.pop_back() 删除最后一个数据。 c.push_back(elem) 在尾部加入一个数据。 c.resize(num) 重新设置该容器的大小 c.size() 回容器中实际数据的个数。

c1.swap(c2) swap(c1,c2) 将c1和c2元素互换 c.rbegin() 传回一个逆向队列的第一个数据。