VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 351|回复: 7

求《实用C++》第47课 C++容器之动态数组vector②练习题答案

[复制链接]
32_avatar_middle
最佳答案
0 
在线会员 发表于 2019-10-11 17:26:13 | 显示全部楼层 |阅读模式
求《实用C++》第47课 C++容器之动态数组vector②练习题答案

定义一个 int 类型的 vector 动态数组,将以下元素:1, 4, 3, 7, 9, 3, 6, 8, 3, 5, 2, 3, 7 插入到动态数组中。之后,使用 for 循环删除动态数组中的值为 3 的元素,并将结果输出出来!
  1. #include <iostream>
  2. using namespace std;
  3. #include <string>
  4. #include "student.h"
  5. #include <fstream>
  6. #include <vector>
  7. int main(int argc, char* argv[])
  8. {
  9.         int a1[] = { 1, 4, 3, 7, 9, 3, 6, 8, 3, 5, 2, 3, 7 };
  10.         vector<int>arr(a1, a1+sizeof(a1)/sizeof(int));
  11.         vector<int>::iterator itor;
  12.         for (itor = arr.begin(); itor != arr.end();itor++)
  13.         {
  14.                 if (*itor==3)
  15.                 {
  16.                         arr.erase(itor);//导致程序崩溃
  17.                 }
  18.         }
  19.         for (itor = arr.begin(); itor != arr.end(); itor++)
  20.         {
  21.                 cout << *itor << endl;
  22.         }
  23.         return 0;
  24. }
复制代码


然后我想通过一个vector<int*>a;先将3所在地址保存,然后再遍历删除,但是程序总是编译不通过;
求一个答案




上一篇:指针数组函数的调用有问题
下一篇:48课vector的erase函数
51_avatar_middle
最佳答案
82 
online_admins 发表于 2019-10-11 19:24:31 | 显示全部楼层
不是编译不通过,是执行崩溃。
提示楼主一下,arr.erase(itor); 调用完之后,itor 就不存在了,这时候再调用 for 循环中的 itor++ 就不对了,楼主再自己想想
23_avatar_middle
最佳答案
0 
在线会员 发表于 2019-10-11 20:40:06 | 显示全部楼层
        int arrint[] = { 1, 4, 3, 7, 9, 3, 6, 8, 3, 5, 2, 3, 7 };
        vector<int> vecint(arrint, arrint+sizeof(arrint) / sizeof(int));


        for (int idx = 0; idx < vecint.size(); ++idx)
        {
                if (vecint[idx] == 3)
                {
                        vecint.erase(vecint.begin() + idx);

                }


}

        for (int idx = 0; idx < vecint.size(); ++idx)
        {

                cout << vecint[idx] << endl;

        }
23_avatar_middle
最佳答案
0 
在线会员 发表于 2019-10-11 20:45:06 | 显示全部楼层
上面的代码并没有直接定义迭代器
如果是非要定义个迭代器来遍历的话,可以这样 如
peop_sex.erase(itor++);//(传拷贝给erase函数,然后指向下一个元素)
或者直接用返回值itor = peop_sex.erase(itor); //erase方法返回(被删除的元素的)下一个元素的迭代器
32_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2019-10-11 23:49:36 | 显示全部楼层
滑翔伞萌哒哒! 发表于 2019-10-11 20:40
int arrint[] = { 1, 4, 3, 7, 9, 3, 6, 8, 3, 5, 2, 3, 7 };
        vector vecint(arrint, arrint+sizeof(arr ...

谢谢大神指点
32_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2019-10-11 23:51:14 | 显示全部楼层
滑翔伞萌哒哒! 发表于 2019-10-11 20:45
上面的代码并没有直接定义迭代器
如果是非要定义个迭代器来遍历的话,可以这样 如
peop_sex.erase(itor++) ...

你直接peop_sex.erase(itor++);是不行的,应该重新为itor赋值
  1. #include <iostream>
  2. using namespace std;
  3. #include <string>
  4. #include "student.h"
  5. #include <fstream>
  6. #include <vector>
  7. int main(int argc, char* argv[])
  8. {
  9.         int a1[] = { 1, 4, 3, 7, 9, 3, 6, 8, 3, 5, 2, 3, 7 };
  10.         vector<int>arr(a1, a1+sizeof(a1)/sizeof(int));
  11.         vector<int>::iterator itor;
  12.         for (itor = arr.begin(); itor != arr.end();itor++)
  13.         {
  14.                 if (*itor==3)
  15.                 {
  16.                         arr.erase(itor);//导致程序崩溃
  17.                         itor = arr.begin();//重新为itor赋值
  18.                 }
  19.         }
  20.         for (itor = arr.begin(); itor != arr.end();itor++)
  21.         {
  22.                 cout << *itor << endl;
  23.         }
  24.         return 0;
  25. }
复制代码
23_avatar_middle
最佳答案
0 
在线会员 发表于 2019-10-12 20:12:10 | 显示全部楼层
aaa@ 发表于 2019-10-11 23:51
你直接peop_sex.erase(itor++);是不行的,应该重新为itor赋值

可以自己试试,是可以的
97_avatar_middle
最佳答案
0 
在线会员 发表于 2020-4-2 16:44:04 | 显示全部楼层
本帖最后由 oline 于 2020-4-2 16:46 编辑

我这边没有使用迭代器遍历,而是用的for循环,虽然麻烦点但是也可以达到目的
#include <iostream>
#include <vector>
using namespace std;
int main()
{
        int num[] = { 1,4,3,7,9,3,6,8,3,5,2,3,7 };
        vector<int> arr_int(num, num + sizeof(num) / sizeof(int));
        int i = 0;
        for (int idx = 0; idx < arr_int.size(); ++idx)
        {
                int value = arr_int[idx];
                if (value == 3)
                {
                        arr_int.erase(arr_int.begin()+i);
                        idx -= 1;
                }
                if (value != 3)
                {
                cout << "arr_int = " << value << endl;
                i +=1;
                }
        }
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

×【发帖 友情提示】
1、请回复有意义的内容,请勿恶意灌水;
2、纯数字、字母、表情等无意义的内容系统将自动删除;
3、若正常回复后帖子被自动删除,为系统误删的情况,请重新回复其他正常内容或等待管理员审核通过后会自动发布;
4、感谢您对VC驿站一如既往的支持,谢谢合作!

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号 )|网站地图wx_jqr

GMT+8, 2020-9-22 21:42

Powered by CcTry.CoM

© 2009-2020 cctry.com

快速回复 返回顶部 返回列表