c++ primer(第五版)筆記 第三章(3)iterator初探

#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);
}

發佈了41 篇原創文章 · 獲贊 1 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章