您的位置:首页 > 编程语言 > C语言/C++

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

2017-06-02 14:05 190 查看
喜欢的朋友可以关注收藏一下:  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;
}运行截图

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息