码迷,mamicode.com
首页 > 编程语言 > 详细

C++ Primer 学习笔记与思考_4 ---getline&&size_type&&const_iterator混搭

时间:2015-08-14 11:45:08      阅读:103      评论:0      收藏:0      [点我收藏+]

标签:c++   primer   const_iterator   size_type   getline   

(一)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 对象和constiterator对象是不一样的,后者是声明一个const迭代器,必须初始化值,并且不能改变。

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


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

C++ Primer 学习笔记与思考_4 ---getline&&size_type&&const_iterator混搭

标签:c++   primer   const_iterator   size_type   getline   

原文地址:http://blog.csdn.net/nk_test/article/details/47658321

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!