仅以此篇博客来纪念本菜鸟的一次“成长“

关于用vector存取指针及相关delete问题(用序偶对解决0-1背包)

我在选用序偶对解决0-1背包时,选取的结构是vector,用vector<int*>来存放其中一个序偶对集合,用vector<vector<int *>>来存放所有序偶对集合,用一个定长为2的一维数组来存取序偶对(选取的结构可能不入大神们法眼,轻喷哈/xd)。在整个算法逻辑都正确的情况下,算法无法正确执行,大概问题如下:

在从vector<vector<int*>>读取序偶对时,明明没有对后一元素进行操作,后一元素却被改变。问题代码如下:

  vector<vector<int*>>fin_ans;        //用来存取所有的序偶对集合,vector<int*>是各个序偶对集合,里面存放序偶对int a[2] = { 0,0 };vector<int *>tem;tem.push_back(a);fin_ans.push_back(tem);            //初始化fin_ansfor (int i = 1; i <=n; i++) {vector<int *>temp;vector<int *>opk = fin_ans[i - 1];int kp = opk.size();int km = 0;while (kp > 0) {int b[2];cout << "fin_ans[" << i - 1 << "]:" << endl;print(fin_ans[i - 1]);?????????????????????????这里第一次打印出fin_ans[i-1]内容b[0] = opk[km][0] + p[i - 1];b[1] = opk[km][1] + w[i - 1];cout << "fin_ans[" << i - 1 << "]:" << endl;print(fin_ans[i - 1]);///???????????????????????????这里第二次打印出fin_ans[i-1]内容,结果却与第一次不一样temp.push_back(b);kp--;km++;}//合并序偶对fin_ans.push_back(Merage_s(fin_ans[i - 1], temp, M));}

在第一处打印时,结果是(0,0)(1,2),但在第二处打印结果却变成了(0,0)(2,3),这两次打印之间的操作是:将opk[km][0]与p[i-1]相加并赋值给b[0],也就是将opk[0][0]与p[0]相加并赋值给b[0],但是,这个操作结束后opk[1][0]与opk[1][1]的值却被改变,也就是(1,2)被改变,从而导致结果错误。

问题所在:经过本菜鸟很久很久的调试以及请教大神后终于找出错误所在-----在while循环中,我创建了 int b[2] 后,第一次循环,将赋值后的b push_back()到temp里面,然后又调用了 fin_ans.push_back(Merage_s(fin_ans[i - 1], temp, M)),及将合并后的序偶对集合放入总集合中。那么问题就来了,我自己想当然的以为b[2]是一个局部变量,而且将b[2] push进temp时只是把b[2]的值给拷贝了进去,然而事实并不是这样!!!temp.push_back(b)实际上是把b的地址空间给存在了temp中(可能理解有错哈,求指教),所以后期进入while循环时对b[2]进行赋值,这时候b[2]对应地址空间上的内容被改变,也就导致先存在temp中、后来又存入fin_ans中的序偶对的值被改变,因为这时候这里面存的是b[2]的地址,所以它对应的值实际上是b[2]地址空间上的值。

后来改为int *b=new int2后,程序可以正常运行,但是又存在一个delete问题,需要在最后准确delete掉new出来的b,由于代码太渣,导致这也是一个需要解决的问题。在这附上改正后的代码,代码存在一个问题就是并没有完全delete掉所有new出来的元素。(求大神指点)
修改后的代码:

#include<iostream>
#include<vector>
using namespace std;
class Solution {
public:void print(vector<int *>temp) {                            //用来打印出temp里的所有元素for (int i = 0; i < temp.size(); i++) {cout << "(" << temp[i][0] << "," << temp[i][1] << ")" << "  ";}cout << endl;}vector<int *> Merage_s(vector<int *>m1, vector<int *>m2, int M) {      //用来在约束规则下合并m1和m2int n = m2.size();for (int i = n - 1; i >= 0; i--) {if (m2[i][1] > M) m2.erase(m2.begin() + i);}int kj = m1.size();int n2 = m2.size();for (int i = kj - 1; i >= 0; i--) {for (int j = 0; j < n2; j++) {if (m1[i][1] > m2[j][1] && m1[i][0] < m2[j][0]){m1.erase(m1.begin() + i);break;}}}for (int k = 0; k < m2.size(); k++) {m1.push_back(m2[k]);}return m1;}bool Judge_in(vector<int*>k,int *q) {for (int i = 0; i < k.size(); i++) {if (k[i][0] == q[0] && k[i][1] == q[1]) return true;}return false;}vector<int> Zeropackage(int *p, int *w, int M, int n) {     //p为每件物品对应的价值,w为每件物品对应的重量,W为最大总重量,n为物品件数vector<int>result(n, -1);            //用来存放物品取用结果vector<vector<int*>>fin_ans;        //用来存取所有的序偶对集合,vector<int*>是各个序偶对集合,里面存放序偶对int a[2] = { 0,0 };vector<int *>tem;tem.push_back(a);fin_ans.push_back(tem);            //初始化fin_ansfor (int i = 1; i <=n; i++) {vector<int *>temp;vector<int *>opk = fin_ans[i - 1];int kp = opk.size();int km = 0;while (kp > 0){int *b = new int[2]();b[0] = opk[km][0] + p[i - 1];b[1] = opk[km][1] + w[i - 1];temp.push_back(b);kp--;km++;}//合并序偶对fin_ans.push_back(Merage_s(fin_ans[i - 1], temp, M));print(fin_ans[i]);}int qw[2], jh = fin_ans[n].size();int kj = jh - 1;for (int i =jh-1; i>=0; i--) {if (fin_ans[n][i][0] > fin_ans[n][kj][0]) kj = i;}qw[0] = fin_ans[n][kj][0];qw[1] = fin_ans[n][kj][1];int qwn[2];for (int h = n-1; h >= 0; h--) {if (Judge_in(fin_ans[h], qw)) { result[h] = 0; }else if (!Judge_in(fin_ans[h], qw)) {qwn[0] = qw[0] - p[h];qwn[1] = qw[1] - w[h];if (Judge_in(fin_ans[h], qwn)) {result[h] = 1;qw[0] = qwn[0];qw[1] = qwn[1];}}}int m = fin_ans[n].size();while ( m> 1) {int * a =fin_ans[n][m - 1];m--;delete a;}return result;}
};
int main() {Solution A;int p[3] = { 1,2,5 };int w[3] = { 2,3,4 };vector<int> atry;atry = A.Zeropackage(p, w, 6, 3);for (int i = 0; i < atry.size(); i++) {cout << atry[i] << "   ";}system("pause");
}

涉及到的知识点:vector的运用、new与delete的应用、局部变量的生命期等。

##关于用vector存取指针及相关delete问题(用序偶对解决0-1背包)相关推荐

  1. 【C】指针的相关运算练习题

    指针运算练习题 前言 例题一 例题二 例题三 例题四 例题五 例题六 例题七 例题八 尾语 前言 嗨喽,大家好~这里是咸鱼安忆. 现在是学C语言时刻~ C语言当中的指针向来是一个难点 本篇文章针对指针 ...

  2. C语言中关于指针等相关理解和使用事宜

    作者:心叶 时间:2018-04-21 17:24 定义 指针是一个变量,其值是另一个变量的地址,地址代表的是在内存中的位置. 需要记住的是,数组变量本身就是一个指针. 地址的类型 地址是存在类型的, ...

  3. Apache - 相关软件 - EnginSite.Apache.Configurator.v1.2.0.66.Cracked.BYE.BYE.BERLUSCONI-BAKA

    Apache - 相关软件 - EnginSite.Apache.Configurator.v1.2.0.66.Cracked.BYE.BYE.BERLUSCONI-BAKA EngInSite Ap ...

  4. mysql 向下兼容_前言本文主要介绍的是关于Mysql8.0驱动getTables返回所有库的表的相关内容,MySQL Connector/J 8.0版本驱动向下兼容之前的5.5...

    前言 本文主要介绍的是关于Mysql8.0驱动getTables返回所有库的表的相关内容,MySQL Connector/J 8.0版本驱动向下兼容之前的5.5+版本MySQL,如果你使用的是5.5+ ...

  5. c++ vector 存放指针_STL-C++ vector部分

    本文是关于c++中STL库中的一些记录,主要是因为之前在网上找到关于STL的资料太过简洁,并且只停留在如何使用函数,对于底层具体实现较少,所以想自己对这些知识记录一下,当然我目前对STL库了解也不深入 ...

  6. C++(1) 指针 new 和delete

    1.概念 new   //typeName * pointer_name = new typeName; delete //delete pointer_name; 注意: (1)new之后要判断,指 ...

  7. 指向vector的指针

    在公司用到一个奇怪的例子,就是vector里存放指针,指针指向一个vector,自己写了一个小demo,例子如下: #include "iostream" #include &qu ...

  8. STL中容器vector迭代器失效的相关问题

    迭代器失效,有两个层面的意思: 无法通过迭代器++,–操作遍历整个stl容器.记作: 第一层失效. 无法通过迭代器存取迭代器所指向的内存. 记作: 第二层失效. vector是个连续内存存储的容器,如 ...

  9. c++ vector 保存指针

    #include <string.h> #include <vector> #include <iostream> using namespace std;int ...

最新文章

  1. QT 生成二维码接口封装
  2. 13.3.虚拟化工具--jinfo详解
  3. CSS属性(根据继承性分为两类)
  4. 如果在iTerm2中复制命令特别卡,就跟慢动作似的,怎么办?
  5. elementui带输入建议查询_elementUi简单实现搜索提词功能
  6. [机器学习] 混淆矩阵和kappa系数
  7. 过滤器模式(Filter Pattern)
  8. 2021全国研究生数学建模竞赛E题思路
  9. 实现类去实现接口的时候,将接口的注释一起重写出来设置
  10. 全国计算机比赛微课视频,“教学之星”全国总决赛 | 冠军朱琦微课及现场比赛视频...
  11. 渗透测试工程师(实习生)面试题目
  12. 编写函数trans(str)实现字符串中数字转化为大写汉字。例如 “0123456789“转化为 “零壹贰叁肆伍陆柒捌玖“。
  13. Java绘制太极阴阳图
  14. 使用OneNote多人分布式共享
  15. Carson带你学Android:这是一份全面详细的属性动画学习攻略!
  16. 我是如何走上CSDN这条路的
  17. 电脑桌面如何添加便签 桌面添加便签的方法是什么
  18. 北京大学 软微初试复试 经验总结贴
  19. Soo 防环机制, 在配置了之后如果show 出来还是没有生效,建议clear 一下bgp,最好实验就是 把 物理接口给 shutdown--在no shutdown ,就好了,记住,!!!
  20. JavaCV实现视频抽帧 JFrame字符动画

热门文章

  1. Java - 选择使用Spring框架的原因(Spring框架为企业级开发带来的好处有哪些)?
  2. H5新增标签详细解说
  3. 飞浆AI studio人工智能课程学习(1)-大模型时代优质Prompt
  4. 第2章 SSD主控和全闪存阵列
  5. [MySQL]约束(constraint)
  6. Jupyterhub安装教程
  7. Project_2007关键
  8. 【牛腩】“/”应用程序中的服务器错误
  9. C语言-数组的定义和引用
  10. [祥云杯2021:Wp]