c++ primer(第五版)笔记 第三章(3)iterator初探

31 篇文章 0 订阅
#include<iostream>
#include<vector>
#include<string>
using std::string;
using std::vector;
using std::cout;
using std::endl;
using std::cin;

void practice_3_23();
void practice_3_22();
void practice_3_24();
void practice_3_25();
int main()
{
	//迭代器(iterator)访问标准库容器的另一种方法,类似于指针,提供对对象的间接访问,并且可以在对象间移动,也分有效和无效
	//所有标准库都支持 iterator,但不一定支持下标,string 类2种方法都支持,但是它不是容器类型
	//所有拥有迭代器的类型,同时拥有返回迭代器的成员
	//成员begin 返回指向第一个元素的迭代器, end 返回指向尾元素的下一个位置的迭代器,如果容器为空,2个成员返回同一个迭代器,都是尾后迭代器(off the end iterator)
	//迭代器的运算类似指针,可以解引用(*),获取对象成员(->),自增自减移动位置(++/--),如果2个迭代器相等(==),说明它们指向同一个元素或同一个容器对象的尾后迭代器
	//迭代器加减一个整数后,仍是一个迭代器,注意不能超出容器范围
	//使用 >=,<=,<,> 关系运算符时,参与比较的两个迭代器必须合法而且指向的是同一个容器的元素或尾匀速的下一个位置
	//满足上述条件的两个迭代器可以进行相减操作,其结果是两个迭代器之间的距离,类型为 difference_type,带符号的整数
	vector<string> vs{"hi","hello","world"};
	auto ivs = vs.begin();
	cout << *ivs << endl;	//解引用
	++ivs;					//自增
	cout << *ivs << endl;
	if (ivs->size() == 5)	//访问元素的成员
		cout << "bingo!!" << endl;
	if (vs.end() == (ivs += 2))	//都是 off the end iterator
		cout << "in the end" << endl;
	//cout << *ivs << endl;		//对尾后迭代器进行解引用,或递增操作会导致运行时错误,因为此时实际迭代器不指向容器内元素
	//++ivs;

	//所有标准库容器都定义了 == 和 != ,但没定义 <,在执行遍历操作时,c++ 程序员应习惯用 !=,这样就不用在意是哪个容器类型
	//任何改变 vector 容量的操作,都会使迭代器失效,注意
	practice_3_23();
	practice_3_22();
	practice_3_24();
	practice_3_25();

	return 0;
}

//读入一行字符,转换为大写后输出
void practice_3_22()
{
	string s;

	cout << "pls input a set of characters:" << endl;

	getline(cin, s);
	while (s.empty())
		getline(cin, s);
	auto is = s.begin();
	while (is != s.end())
	{
		*is = toupper(*is);
		++is;
	}
	cout << s << endl;
}
//打印 vector<int> 的内容
void cout_vector_int(vector<int> &vi)
{
	for (auto &c : vi)
		cout << c << " ";
	cout << endl;
}
//读入一组整数,将每个元素变为2倍后,输出
void practice_3_23()
{
	vector<int> vi;
	int i = 0;

	while (i != 10)
	{
		vi.push_back(i);
		++i;
	}
	cout_vector_int(vi);
	auto ivi = vi.begin();
	while (ivi != vi.end())
	{
		*ivi *= 2;
		++ivi;
	}
	cout_vector_int(vi);
}
//输入一组整数,存入 vector,输出每对相邻整数的和,再输出第一个数和最后一个数的和,第二个和倒数第二个整数的和,依次类推
void practice_3_24()
{
	int n = 0;
	vector<int> vi;

	cout << "pls input a set of int: (end with 0 )" << endl;
	while (cin >> n)
	{
		if (!n)
			break;
		vi.push_back(n);
	}
	auto ivi = vi.begin();
	while (ivi != (vi.end() - 1))
	{
		cout << *ivi << " + " << *(ivi + 1) << " = " << *ivi + *(ivi + 1) << endl;
		++ivi;
	}
	cout << endl;
	auto x = vi.size();
	int mid = (x % 2) ? ((x - 1) / 2) : (x / 2);
	decltype(x) i = 0;
	ivi = vi.begin();
	auto evi = vi.end();
	while (i != mid)
	{
		cout << *(ivi + i) << " + " << *(evi - 1 - i) << " = " << *(ivi + i) + *(evi - 1 - i) << endl;
		++i;
	} 
	cout << endl;
}
//输入一组分数,最大一百分,以10分单位阶段,输出没阶段内的数量
void practice_3_25()
{
	int n = 0;
	vector<int> vi(11, 0);

	cout << "pls input a set of int:(0 - 100)" << endl;
	auto ivi = vi.begin();
	while (cin >> n)
	{
		if (n > 100 || n < 0)
			break;
		++*(ivi + n / 10);
	}
	cout_vector_int(vi);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值