有关vector的求助 不知道怎么回事就越界了

sure631440254 2011-11-10 01:36:39

// 图遍历.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"


int _tmain(int argc, _TCHAR* argv[])
{
return 0;
}
#include <iostream>
using namespace std;
#include <vector>
#include <list>
#include <string>

#define MAX_VERTEX_NUM 8

class CEdge
{
friend class CGraph;
private:
int ivex;
int jvex;
bool mark;
public:
//CEdge *info;
CEdge *ilink;
CEdge *jlink;
int GetIvex()const{return ivex;}
int GetJvex()const{return jvex;}
bool GetMark()const{return mark;}
void SetIvex(const int i){ivex=i;}
void SetJvex(const int j){jvex=j;}
void SetMark(const bool m){mark=m;}
CEdge():ivex(0),jvex(0),mark(0){}
CEdge (const CEdge&ce):ivex(ce.GetIvex()),jvex(ce.GetJvex()),mark(ce.GetMark()),ilink(ce.ilink),jlink(ce.jlink){}
CEdge (const int i, const int j,const bool m):ivex(i),jvex(j),mark(m){}
};

class CVertex
{
friend class CGraph;
private:
string data;
public:
CVertex *parent;
CVertex *children;
CEdge *firstedge;
string GetData()const{return data;}
void SetData(const string d){data=d;}
CVertex():data("0"){}
CVertex(const CVertex&v):data(v.GetData()),firstedge(v.firstedge){}
CVertex(const string d):data(d){}
};

typedef vector<CVertex>VecVertex;
typedef vector<CEdge>VecEdge;

class CGraph
{
public:
VecVertex vertexes;
VecEdge edges;
void addAnEdge(int i,int j);
void addAnVertex(string i);
void linkVertexToEdge(CVertex *v,CEdge *e);
void InitEdge(CEdge *e);
//void linkIlinkToEdge(CEdge *e1,CEdge *e2);
//void linkJlinkToEdge(CEdge *e1,CEdge *e2);
void linkAllEdge();
};

void CGraph::addAnVertex(string i)
{
CVertex *ver=new CVertex;
ver->SetData(i);
vertexes.push_back(*ver);
}

void CGraph::addAnEdge(int i,int j)
{
CEdge *ed=new CEdge;
ed->SetIvex(i);
ed->SetJvex(j);
ed->SetMark(0);
edges.push_back(*ed);
}

void CGraph::InitEdge(CEdge *e)
{
e->ilink=new CEdge;
e->ilink=NULL;
e->jlink=new CEdge;
e->jlink=NULL;
}

void CGraph::linkVertexToEdge(CVertex *v,CEdge *e)
{
v->firstedge=new CEdge;
v->firstedge=e;
}

/*void CGraph::linkIlinkToEdge(CEdge *e1,CEdge *e2)
{
//InitEdge(e1);
//InitEdge(e2);
e1->ilink=e2;
e2->ilink=NULL;
e2->jlink=NULL;
}

void CGraph::linkJlinkToEdge(CEdge *e1,CEdge *e2)
{
//InitEdge(e1);
//InitEdge(e2);
e1->jlink=e2;
e2->ilink=NULL;
e2->jlink=NULL;
}*/

void CGraph::linkAllEdge()
{
int iorj;
for(unsigned int i=0;i<edges.size();i++)
{
InitEdge(&edges[i]);
}//全部初始化
for(unsigned int i=0;i<vertexes.size();i++)
{
unsigned int j=0;
while(j<edges.size())
{
while(edges[j].GetIvex()!=i||edges[i].GetJvex()!=i)
j++;
if(edges[j].GetIvex()==i)
iorj=0;
else if(edges[j].GetJvex()==i)
iorj=1;
unsigned int k=j;
while((edges[k].GetIvex()!=i||edges[k].GetJvex()!=i)&&k<edges.size())
k++;
if((edges[k].GetIvex()==i||edges[k].GetJvex()==i)&&iorj==0)
{
*edges[j].ilink=edges[k];
j=k;
}
else if((edges[k].GetIvex()==i||edges[k].GetJvex()==i)&&iorj==1)
{
*edges[j].jlink=edges[k];
j=k;
}
}
}
}

void main()
{
CGraph g;
g.addAnVertex("A");
g.addAnVertex("B");
g.addAnVertex("C");
g.addAnVertex("D");
g.addAnEdge(0,1);
g.addAnEdge(0,2);
g.addAnEdge(1,3);
g.linkAllEdge();
system("pause");
}


错误出现在
for(unsigned int i=0;i<edges.size();i++)
{
InitEdge(&edges[i]);
}//全部初始化

我这里的edges是个vector 它的size现在是3
我让i<edges.size()好把我这个edges中所有的元素按照
void CGraph::InitEdge(CEdge *e)
{
e->ilink=new CEdge;
e->ilink=NULL;
e->jlink=new CEdge;
e->jlink=NULL;
}
这个函数来进行初始化
可是不知道为什么怎么弄都越界

把全部初始化的函数写成
edges[0]->ilink=new CEdge; 也会越界
本人新手 希望赐教
...全文
115 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
sure631440254 2011-11-11
  • 打赏
  • 举报
回复
问题解决了 还是自己解决的...感谢大家的帮助 散分了~
sharptiger123 2011-11-10
  • 打赏
  • 举报
回复
先判断总体数组的大小
yuucyf 2011-11-10
  • 打赏
  • 举报
回复
1)用到New的地方几乎都是内存泄露.
typedef vector<CVertex>VecVertex;
typedef vector<CEdge>VecEdge;
void CGraph::addAnEdge(int i,int j)
{
CEdge *ed=new CEdge;
ed->SetIvex(i);
ed->SetJvex(j);
ed->SetMark(0);
edges.push_back(*ed);
}
这样何必用New呢?这样的做法会导致内存泄露,你把定义:
typedef vector<CVertex>VecVertex;
typedef vector<CEdge>VecEdge;
改为:
typedef vector<CVertex *>VecVertex;
typedef vector<CEdge *>VecEdge;

2)而且参数是指针类型的直接拿过来用也不进行Checked.
3)
void CGraph::addAnEdge(int i,int j)
{
CEdge *ed=new CEdge;
ed->SetIvex(i);
ed->SetJvex(j);
ed->SetMark(0);
edges.push_back(*ed);
}
压到edges中的Edge值,int ivex,int ivex值还是默认值,你这里没有提供构造函数,所以你在之前SetIVex,SetJvex,都是没有意义的.

4)问题太多,楼主好好在Review下.




呔妖怪来嘛 2011-11-10
  • 打赏
  • 举报
回复
e->ilink=new CEdge;
e->ilink=NULL;
e->jlink=new CEdge;
e->jlink=NULL;
你这是干嘛
而且都没有delete

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧