4 ---getlinesize

(一)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 //okvector::size_type //error ,vector只是类模版 具体机器的区别可以参考 但是,我也有一个疑问,,在实际编程中,都要使用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不可改变}

另外,要注意

vector<int> nums(10);const vector<int>::iterator cit = nums.begin();*cit = 1; //ok++cit; //error这种应用没什么实际用处。

版权声明:本文为博主原创文章,未经博主允许不得转载。

背起简单的行攘,沐浴自由的风。

4 ---getlinesize

相关文章:

你感兴趣的文章:

标签云: