STL中的list和vector使用(一)更正

喜歡的朋友可以關注收藏一下:  http://blog.csdn.NET/qq_31201973

本文如有錯誤,請及時私信我。

原版要求:

創建一個list容器,放置6個整型數值[0, 1, 30, 20, 10, 0]

1. 從後向前打印出容器內的元素

2. 向list容器後面添加兩個元素,並對容器內的值求和並打印

3. 打印鏈表的中間元素

4. 找到不爲0的元素,複製到一個vector中並打印vector元素


第3問出現了些小問題我做一下更正

	cout << "3. 打印鏈表的中間元素" << endl;
		i = (L.size()) / 2;					//中間元素這裏默認是中間靠前的一個,這樣無論容器元素是偶數還是奇數都適用;
		for (plist = L.begin();; ++plist)		//有點類似於快指針,雖然少循環了一半的次數,但不是嚴格意義上的快指針,嚴格意義快指針是fast=fast->next->next; ,速度稍微快一點。
		{
			--i;
			if (i == 0)
			{
				cout << "中間元素爲:" << *plist << endl << endl;		//打印的是第四個元素L{0,1,30,20,10,0,輸入元素1,輸入元素2} ,如果總元素是8個,那應該打印第4個,20 !!!
				break;					//防止再進入接下來的循環
			}
		}
這個問題其實是快指針第一步就跳到了單數元素三的原因,所以索性我就不用快指針


我還對上文中的代碼進一步做了優化,效率得到了提供,完整代碼如下:


//						main.cpp
#include<iostream>
#include<list>
#include<vector>


using namespace std;
typedef list<int> INTLIST;

int main()
{
	INTLIST L{0,1,30,20,10,0};
	INTLIST::iterator plist;
	int sum = 0, i;
	long long int a;
	vector<int> V;
	vector<int>::iterator pvector = V.begin();

	cout << "1. 從後向前打印出容器內的元素." << endl;
	for (plist = --(L.end());; --plist)		//for無限定條件時不判斷
	{
		cout << *plist << "  ";
		if (plist == L.begin())				//在此處判斷並不影響效率		
		{
			break;
		}
	}

	cout << endl << endl << "2. 向list容器後面添加兩個元素,並對容器內的值求和並打印." << endl;
	cout << "請任意輸入兩個int類型數字:";
	for (i = 0; i < 2; ++i)
	{
		cin >> a;
		while (a < -2147483647 || a > 2147483647)			//int範圍邊界的判斷,經測試實際範圍應該是-2147483648~2147483647。
		{//但是加判斷里加負號以後會顯示錯誤	1	error C4146: 一元負運算符應用於無符號類型,結果仍爲無符號類型。
			//這一問題是由於編譯器SDL安全檢查認爲這一操作(通常是爲無符號整形取負的操作)無效而產生的.
			//當編譯器看到2147483648時會自動認爲超過了2147483647,直接轉換成unsigned int.當編譯器看到負號的時候直接取反是它本身,編譯器存不了那麼大的數,詳細看一元運算符。
			cout << "整數(int)範圍非法,請重新輸入整數(int   -2147483648~2147483647):";
			cin >> a;
		}
		L.push_back(a);
	}
	for (auto& plist : L)
	{
		sum+=plist;
	}
	cout << "list容器內" << L.size() << "個元素的和爲:" << sum << endl << endl;

	cout << "3. 打印鏈表的中間元素" << endl;
	//if ((L.size()) % 2 == 0)				//如果是偶數用速度會少循環一般次數
	//{
		i = (L.size()) / 2;					//中間元素這裏默認是中間靠前的一個,這樣無論容器元素是偶數還是奇數都適用;
		for (plist = L.begin();; ++plist)		//有點類似於快指針,雖然少循環了一半的次數,但不是嚴格意義上的快指針,嚴格意義快指針是fast=fast->next->next; ,速度稍微快一點。
		{
			--i;
			if (i == 0)
			{
				cout << "中間元素爲:" << *plist << endl << endl;		//打印的是第四個元素L{0,1,30,20,10,0,輸入元素1,輸入元素2} ,如果總元素是8個,那應該打印第4個,20 !!!
				break;					//防止再進入接下來的循環
			}
		}
	//}
	//else
	//{
	//	i = (L.size()) / 2;					//中間元素這裏默認是中間靠前的一個,這樣無論容器元素是偶數還是奇數都適用;
	//	for (plist = L.begin();; ++plist)
	//	{
	//		--i;
	//		if (i == 0)
	//		{
	//			cout << "中間元素爲:" << *plist << endl << endl;		//打印的是第四個元素L{0,1,30,20,10,0,輸入元素1,輸入元素2} ,如果總元素是8個,那應該打印第4個,20 !!!
	//			break;					//防止再進入接下來的循環
	//		}
	//	}
	//}

	cout << "4. 找到不爲0的元素,複製到一個vector中並打印vector元素" << endl;
	for (auto plist: L)
	{
		if (plist != 0)
		{
			V.push_back(plist);
		}
	}
	cout << "不爲0的元素已經插入到vector中,共" << V.size() << "個元素." << endl;
	cout << "vector中的元素爲:";
	for (auto pvector : V)
	{
		cout << pvector << "  ";
	}
	cout << endl << endl;
	cout << "經測試程序結果符合要求." << endl << endl;

	system("pause");
	return 0;
}
運行截圖

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章