查漏补缺——字符串、数组
2016-06-29 11:39
176 查看
1、读写字符串string对象的操作
(1)在执行读取操作时(cin>>str),string对象会自动忽略开头的空白(即空格符、换行符、制表符等)并从第一个真正的字符开始读起,直到遇到下一处空白为止。
(2)如果要读取未知数量的string对象,使用while(cin>>str)就会反复读取,直至遇到文件的结束标记或非法输入。这个点虽然很小,但是我很容易搞错,要注意。
(3)有时候需要读取一行并保留其中的空格,那么使用getline(cin,str),表示函数从指定的输入流cin中读入内容,直到遇到换行符为止(注意换行符也被读进来了),然后把所读的内容存入那个string对象中去(注意不存换行符)。getline一遇到换行符就结束读取并返回结果,哪怕输入的一开始就是换行符也是如此,这种情况下结果是空字符串。同样,我们可以使用while(getline(cin,str))进行反复读取一行直至达到文件末尾。
2、string的empty和size操作
str.empty()根据string对象是否为空返回一个bool值。
str.size()返回string对象的长度(字符的个数),其实size函数返回的是sting::size_type类型的值,一般使用auto或decltype来推断变量的类型:
auto len=str.size();
注意:如果一条表达式中已经有了size()函数,就不要再使用int了,这样可以避免混用int和unsigned可能带来的问题。因为在判断s.size()<n时,若n为具有负值的int,则判断结果几乎肯定是true的,因为负值n会自动转换成一个比较大的无符号值。
3、处理string对象中的字符
在cctype头文件中定义了一组标准库函数处理某个字符的特性:isalpha(c),isdigit(c),islower(c),isspace(c),isupper(c),tolower(c),toupper(c)等
基于范围的for语句使用非常方便,如:for(auto &c : str){c=toupper(c);}
注意:要想改变string对象中字符的值,必须把循环变量定义成引用类型。
范围for语句体内不应该改变其所遍历的序列的大小。如果循环体内包含向例如vector对象添加元素的语句,如push_back,则不能使用范围for语句。使用范围for语句也是确保下标合法(预防缓冲区溢出)的一种合理手段。
4、数组
(1)在定义数组的时候,必须指定数组的类型,不允许使用auto关键字由初始值的列表推断类型。另外和vector一样,数组的元素应为对象,因此不存在引用的数组。
(2)不能将数组的内容拷贝给其他数组作为其初始值,也不能用数组为其他数组赋值。
(3)与vector和string一样,当需要遍历数组的所有元素时,最好的办法是使用范围for语句,此外,而且在使用下标访问数组时,下标是否在合理范围之内由程序员负责检查。
(4)数组内置的下标运算符所用的索引值不是无符号类型,这一点与vector和string不一样,内置的下标运算符可以处理负值,表示相对当前位置向前的多少位置,当然结果地址必须指定原来指针所指向同一数组中的元素。
(5)我们知道,不允许使用一个数组为另一个内置类型的数组赋初值,也不允许一个vector对象初始化数组,但是,允许使用数组来初始化vector对象,只要指明拷贝区域的首地址和尾后地址就可以了:vector<int> ivec(begin(int_arr),end(int_arr));
其中:C++11引入两个名为begin和end的函数可以得到一个数组首元素的指针和数组尾后位置的指针。和vector等的begin()、end()不同,这两个是函数而非成员函数。
(6)要使用范围for语句处理多维数组,除了最内层的循环外,其他所有的循环的控制变量都应该基于引用类型,这样避免数组被自动转为指针;如果要改变元素的值,要把所有的控制变量都声明成引用才可以。
建议:现在的C++程序应当尽量使用vector和迭代器,避免使用内置数组和指针;应该尽量使用string,避免使用C风格的基于数组的字符串(以空字符结束的字符数组)
(1)在执行读取操作时(cin>>str),string对象会自动忽略开头的空白(即空格符、换行符、制表符等)并从第一个真正的字符开始读起,直到遇到下一处空白为止。
(2)如果要读取未知数量的string对象,使用while(cin>>str)就会反复读取,直至遇到文件的结束标记或非法输入。这个点虽然很小,但是我很容易搞错,要注意。
(3)有时候需要读取一行并保留其中的空格,那么使用getline(cin,str),表示函数从指定的输入流cin中读入内容,直到遇到换行符为止(注意换行符也被读进来了),然后把所读的内容存入那个string对象中去(注意不存换行符)。getline一遇到换行符就结束读取并返回结果,哪怕输入的一开始就是换行符也是如此,这种情况下结果是空字符串。同样,我们可以使用while(getline(cin,str))进行反复读取一行直至达到文件末尾。
2、string的empty和size操作
str.empty()根据string对象是否为空返回一个bool值。
str.size()返回string对象的长度(字符的个数),其实size函数返回的是sting::size_type类型的值,一般使用auto或decltype来推断变量的类型:
auto len=str.size();
注意:如果一条表达式中已经有了size()函数,就不要再使用int了,这样可以避免混用int和unsigned可能带来的问题。因为在判断s.size()<n时,若n为具有负值的int,则判断结果几乎肯定是true的,因为负值n会自动转换成一个比较大的无符号值。
3、处理string对象中的字符
在cctype头文件中定义了一组标准库函数处理某个字符的特性:isalpha(c),isdigit(c),islower(c),isspace(c),isupper(c),tolower(c),toupper(c)等
基于范围的for语句使用非常方便,如:for(auto &c : str){c=toupper(c);}
注意:要想改变string对象中字符的值,必须把循环变量定义成引用类型。
范围for语句体内不应该改变其所遍历的序列的大小。如果循环体内包含向例如vector对象添加元素的语句,如push_back,则不能使用范围for语句。使用范围for语句也是确保下标合法(预防缓冲区溢出)的一种合理手段。
4、数组
(1)在定义数组的时候,必须指定数组的类型,不允许使用auto关键字由初始值的列表推断类型。另外和vector一样,数组的元素应为对象,因此不存在引用的数组。
(2)不能将数组的内容拷贝给其他数组作为其初始值,也不能用数组为其他数组赋值。
(3)与vector和string一样,当需要遍历数组的所有元素时,最好的办法是使用范围for语句,此外,而且在使用下标访问数组时,下标是否在合理范围之内由程序员负责检查。
(4)数组内置的下标运算符所用的索引值不是无符号类型,这一点与vector和string不一样,内置的下标运算符可以处理负值,表示相对当前位置向前的多少位置,当然结果地址必须指定原来指针所指向同一数组中的元素。
(5)我们知道,不允许使用一个数组为另一个内置类型的数组赋初值,也不允许一个vector对象初始化数组,但是,允许使用数组来初始化vector对象,只要指明拷贝区域的首地址和尾后地址就可以了:vector<int> ivec(begin(int_arr),end(int_arr));
其中:C++11引入两个名为begin和end的函数可以得到一个数组首元素的指针和数组尾后位置的指针。和vector等的begin()、end()不同,这两个是函数而非成员函数。
(6)要使用范围for语句处理多维数组,除了最内层的循环外,其他所有的循环的控制变量都应该基于引用类型,这样避免数组被自动转为指针;如果要改变元素的值,要把所有的控制变量都声明成引用才可以。
建议:现在的C++程序应当尽量使用vector和迭代器,避免使用内置数组和指针;应该尽量使用string,避免使用C风格的基于数组的字符串(以空字符结束的字符数组)
相关文章推荐
- Maven安装配置
- Chrome 开发工具之Network
- Python_day8_面向对象(多态、成员修饰符、类中特殊方法、对象边缘知识)、异常处理之篇
- C++中的trivial、standard layout、POD
- IOS UIScrollView + UIButton 实现segemet页面和顶部标签页水平滚动效果
- linux 查看硬件信息
- 2、创建rrd数据库
- java sqlxml (有错误,sqlite3可能不支持xml类型)
- 获取java web项目里面所有的properties文件并组装在一起,使用方便,配置简单
- JMS中的DeliveryMode和DurableSubscriber
- iOS textView输入限制中文输入法和英文输入法 及是否高亮状态区分
- linux udp组播接收问题及原理分析
- 日常小结-http协议
- 全面了解servlet中cookie的使用方法
- Logstash的形象比喻
- 基于MATLAB的高等数学 笛卡尔乘积(直积)
- 基于MATLAB的高等数学 对于已知的函数画图(二维) 绝对值函数
- CRC32算法
- Android WebView保存Cookie登录
- 浮动模型