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

运行截图

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值