(一)getline的用法
我们在使用string读入字符串的时候,其输入操作符:
* 读取并忽略开头所有空白字符(如空格,换行符,制表符)
* 读取字符直至再次遇到空白字符,读取终止。
所以如果我们输入“hello world”,string将只输出hello。
为了解决这个问题,我们引入getline函数,它接受两个参数:一个输入流对象和一个string对象,但是getline会读取换行符,保存到string中时却忽略换行符,所以string中是空串。
我们通常用getchar()吃掉不应该存在的换行符。
#include <iostream> #include <string> #include <cstring> using namespace std; int main() { int a; cin >> a; getchar(); //不加的话会导致getline读入回车当作第一次输入 while (a--) { string s; getline(cin, s); cout << s << endl; } return 0; }
(二)关于string::size_type
书中提到,string的size()函数返回的是size_type类型(配套类型),使用这些配套类型就能够使库类型的使用与机器无关,它的定义和unsigned类型具有相同的含义,因为unsigned数值范围大于int,所以不要把size的返回类型赋给一个int变量。
并且在进行下标索引取值的使用,最好也是用size_type类型。
string str = "welcome to the icpc world!"; string::size_type len = str.size(); cout << len << endl; 此外vector的size也返回size_type类型 vector<int>::sizetype //ok vector::size_type //error ,vector只是类模版
具体机器的区别可以参考 http://blog.csdn.net/zhongzhiwei/article/details/8678885
但是,我也有一个疑问,在实际编程中,都要使用size_type定义变量吗?还是在不靠近临界值的时候采用int更方便? 求解答。
(三)为什么推荐c++程序员使用!=而不是<在for循环中
C++程序员习惯于优先使用!=而不是<来编写循环条件,这是安全的泛型编程的要求。
如下代码:
vector<int> ivec; for (vector<int>::size_type ix = 0; ix != ivec.size(); ++ix) ivec[ix] = ix;
C程序员倾向于使用小于,而C++程序员更倾向于使用不等于,这可能出于习惯原因,实际上,C++中有大量的面向迭代器的代码,对于更多的人来说,遍历数据的时候迭代器“不等于”迭代器尾标可能与“小于”迭代器尾标相比可以更形象地描述问题。
此外,把终止条件ivec.size()写在循环里面而不是先定义变量将其记录,在循环中使用变量。是因为我们经常对容器进行增加,删除的操作,size会发生变化,记录一个常量会导致迭代器失效的问题,此外,不必太担心效率问题,size是inline函数,每次调用的代价很小。
(四)const_iterator
我们可以使用迭代器遍历容器,并且可以对迭代器进行解引用改变容器中元素的值(*iter = 5)。但是如果我们不想改变元素的值呢?这里讲解const_iterator.
当我们对const_iterator类型解引用时,得到的是一个指向const对象的引用,该对象不可改变。可以用于const vector或者非const vector均可。
vector<string> text; for (vector<string>::const_iterator iter = text.begin(); iter != text.end(); ++iter) { cout << *iter << endl; *iter = " "; //error,const不可改变 }
另外,要注意const_iterator 对象和const的iterator对象是不一样的,后者是声明一个const迭代器,必须初始化值,并且不能改变。
vector<int> nums(10); const vector<int>::iterator cit = nums.begin(); *cit = 1; //ok ++cit; //error 这种应用没什么实际用处。
版权声明:本文为博主原创文章,未经博主允许不得转载。