vector改为LIST?

tbg1986tbg 2012-08-25 05:24:12
typedef struct tagDXFLine
{
CPoint startPoint;
CPoint endPoint;
}DXFLINE;

typedef std::vector<tagDXFLine> CDXFLineList;

如果上面的vector 全部改为

typedef list<tagDXFLine> CDXFLineList;

下面的代码中用到vector要如何改呢?

int TxtSize;
TxtSize=m_mDXFTxtList.size();//有多少个文字
int LineSize=0;
CDXFLineList tempDXFLineList;//保存临时的线条
m_mDXFTxtList.sort();
BOOL bAdd = FALSE;
list <tagDXFTxt>::iterator tempDXFTxtList;
DXFLINE srcLine;
m_myBufferList.clear();
//文字进行排序
for ( tempDXFTxtList = m_mDXFTxtList.begin();tempDXFTxtList != m_mDXFTxtList.end(); tempDXFTxtList++ )
{

CString test;
test.Format(_T("%d\n%sx:%d\ny:%d\n"),tempDXFTxtList->Num,tempDXFTxtList->TxtContents,tempDXFTxtList->point.x,tempDXFTxtList->point.y);
//AfxMessageBox(test);
tempDXFLineList.clear();
LineSize=m_myDXFLineList.size();//有多少条

for (int i=0;i<LineSize;i++)
{
if ((tempDXFTxtList->point ==m_myDXFLineList.at(i).startPoint))
{
srcLine.startPoint = m_myDXFLineList.at(i).startPoint;
srcLine.endPoint = m_myDXFLineList.at(i).endPoint;
tempDXFLineList.push_back(srcLine);
m_myDXFLineList.erase(m_myDXFLineList.begin()+i);
break;
}else if(tempDXFTxtList->point == m_myDXFLineList.at(i).endPoint)
{
srcLine.startPoint = m_myDXFLineList.at(i).endPoint;
srcLine.endPoint = m_myDXFLineList.at(i).startPoint;
tempDXFLineList.push_back(srcLine);
m_myDXFLineList.erase(m_myDXFLineList.begin()+i);
break;
}

}

//AfxMessageBox(_T("3"));
DWORD t1 = timeGetTime();
int LineCount=m_myDXFLineList.size();
for (int j=m_myDXFLineList.size()-1; j>=0; j--)
{
DXFLINE tempLine;
int x2=tempDXFLineList.at(tempDXFLineList.size()-1).endPoint.x;
int y2=tempDXFLineList.at(tempDXFLineList.size()-1).endPoint.y;
int x1= m_myDXFLineList.at(j).startPoint.x;
int y1= m_myDXFLineList.at(j).startPoint.y;
int endx1= m_myDXFLineList.at(j).endPoint.x;
int endy1= m_myDXFLineList.at(j).endPoint.y;
bAdd = FALSE;
if ((m_myDXFLineList.at(j).startPoint==tempDXFLineList.at(tempDXFLineList.size()-1).endPoint))
{
tempLine.startPoint=m_myDXFLineList.at(j).startPoint;
tempLine.endPoint=m_myDXFLineList.at(j).endPoint;
tempDXFLineList.push_back(tempLine);
m_myDXFLineList.erase(m_myDXFLineList.begin()+j);
bAdd = TRUE;

}else if (m_myDXFLineList.at(j).endPoint==tempDXFLineList.at(tempDXFLineList.size()-1).endPoint)
{
tempLine.startPoint=m_myDXFLineList.at(j).endPoint;
tempLine.endPoint=m_myDXFLineList.at(j).startPoint;
tempDXFLineList.push_back(tempLine);
m_myDXFLineList.erase(m_myDXFLineList.begin()+j);
bAdd = TRUE;
}
if (bAdd)
{
j=m_myDXFLineList.size();
}

}
m_myBufferList.push_back(tempDXFLineList);
DWORD t2 = timeGetTime();
double spend=(double)(t2-t1);
CString msg;
msg.Format(_T("运行完成,一共花费时间为:%d毫秒"),(int)spend);
// AfxMessageBox(msg);
}
...全文
171 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
hztj2005 2012-08-28
  • 打赏
  • 举报
回复
m_myDXFLineList.at // list不能用 at,所以代码要改,麻烦不少。

10 (万) 点每次需要28毫秒可是20万的话每次就需要2秒啦?

那可能是内存不够。10 万数据全在内存,20万需要从硬盘读取。就慢了很多。
tbg1986 2012-08-28
  • 打赏
  • 举报
回复
我发现好像是tempDXFLineList.push_back(tempLine);
这个地方导致慢的。注释掉,调试的话,速度明显提高了。但是这里我仍然需要把找到的templine直线存贮起来。这个地方需要如何写?
会不会应为内存不够。vector需要重新为它开辟内存。复制所有元素导致的。我开始也有使用
m_myDXFLineList.resize(1000000);
m_myDXFCircleList.resize(1000000);
m_myDXFRectList.resize(10000000);
为它开辟可以存贮100万的数据,结果程序刚一打开就很卡,而执行到上面的代码的时候,还是没有速度提高?
tbg1986 2012-08-28
  • 打赏
  • 举报
回复
我发现好像是tempDXFLineList.push_back(tempLine);
这个地方导致慢的。注释掉,调试的话,速度明显提高了。但是这里我仍然需要把找到的templine直线存贮起来。这个地方需要如何写?
会不会应为内存不够。vector需要重新为它开辟内存。复制所有元素导致的。我开始也有使用
m_myDXFLineList.resize(1000000);
m_myDXFCircleList.resize(1000000);
m_myDXFRectList.resize(10000000);
为它开辟可以存贮100万的数据,结果程序刚一打开就很卡,而执行到上面的代码的时候,还是没有速度提高?
tbg1986tbg 2012-08-28
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]
.size()都提出来
[/Quote]

不是push_back复制引起的。再说我是找到后,才push_back的。相对于20万点的话,只有其中300条符合要求。所以我猜想花费的时间花费在查询上
tbg1986tbg 2012-08-28
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]
m_myDXFLineList.size()提出来,因为每次循环都会计算,可是试试
[/Quote]

有试过你的,把需要重复使用的都提出来,时间会减小些,但是减小的幅度不是很大。

我在猜想会不是由于Vector本身对大量数据进行限制导致的?
但是改为list的话,由于list不支持随机访问。但是我的算法中包含太多的访问,使用list的话是不是应该效率会更低?
高人指导下。是不是只有list才能解决这个问题。 另该list改起来似乎很麻烦,,
tbg1986tbg 2012-08-28
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 的回复:]
m_myDXFLineList.at // list不能用 at,所以代码要改,麻烦不少。

10 (万) 点每次需要28毫秒可是20万的话每次就需要2秒啦?

那可能是内存不够。10 万数据全在内存,20万需要从硬盘读取。就慢了很多。
[/Quote]

有什么办法,有试过使用resize 给分配空间,但是结果好象还是一样慢?
z8323664 2012-08-28
  • 打赏
  • 举报
回复
这么多下标操作 还是用vector 吧 List 没有下标操作的
dickbarry 2012-08-27
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]
各位 :
但是我发现10万个数据和20万个数据在执行下面代码的时候,差异很大打,10点每次需要28毫秒可是20万的话每次就需要2秒啦。这个可能是什么原因导致的,?
DWORD t1 = timeGetTime();
int LineCount=m_myDXFLineList.size();
for (int j=m_myDXFLineList.size()-1; j>=0; j……
[/Quote]
是不是m_myBufferList.push_back(tempDXFLineList);复制导致的

把时间统计放到这句话之前,再试试
yht7905907 2012-08-27
  • 打赏
  • 举报
回复
.size()都提出来
yht7905907 2012-08-27
  • 打赏
  • 举报
回复
m_myDXFLineList.size()提出来,因为每次循环都会计算,可是试试
tbg1986tbg 2012-08-27
  • 打赏
  • 举报
回复
各位 :
但是我发现10万个数据和20万个数据在执行下面代码的时候,差异很大打,10点每次需要28毫秒可是20万的话每次就需要2秒啦。这个可能是什么原因导致的,?
DWORD t1 = timeGetTime();
int LineCount=m_myDXFLineList.size();
for (int j=m_myDXFLineList.size()-1; j>=0; j--)
{
DXFLINE tempLine;
int x2=tempDXFLineList.at(tempDXFLineList.size()-1).endPoint.x;
int y2=tempDXFLineList.at(tempDXFLineList.size()-1).endPoint.y;
int x1= m_myDXFLineList.at(j).startPoint.x;
int y1= m_myDXFLineList.at(j).startPoint.y;
int endx1= m_myDXFLineList.at(j).endPoint.x;
int endy1= m_myDXFLineList.at(j).endPoint.y;
bAdd = FALSE;
if ((m_myDXFLineList.at(j).startPoint==tempDXFLineList.at(tempDXFLineList.size()-1).endPoint))
{
tempLine.startPoint=m_myDXFLineList.at(j).startPoint;
tempLine.endPoint=m_myDXFLineList.at(j).endPoint;
tempDXFLineList.push_back(tempLine);
m_myDXFLineList.erase(m_myDXFLineList.begin()+j);
bAdd = TRUE;

}else if (m_myDXFLineList.at(j).endPoint==tempDXFLineList.at(tempDXFLineList.size()-1).endPoint)
{
tempLine.startPoint=m_myDXFLineList.at(j).endPoint;
tempLine.endPoint=m_myDXFLineList.at(j).startPoint;
tempDXFLineList.push_back(tempLine);
m_myDXFLineList.erase(m_myDXFLineList.begin()+j);
bAdd = TRUE;
}
if (bAdd)
{
j=m_myDXFLineList.size();
}

}
m_myBufferList.push_back(tempDXFLineList);
DWORD t2 = timeGetTime();
double spend=(double)(t2-t1);
CString msg;
msg.Format(_T("运行完成,一共花费时间为:%d毫秒"),(int)spend);
// AfxMessageBox(msg);


就是这段。花费的时间差异太大了。。
tbg1986tbg 2012-08-26
  • 打赏
  • 举报
回复
我处理点的时候。发现10万点和20万速度差异很大。所以就想换成LIST主要是这里 for (int j=m_myDXFLineList.size()-1; j>=0; j--)

要如何修改 。?
傻X 2012-08-25
  • 打赏
  • 举报
回复
从理论上讲
list能够快速定位,便于增加和删除节点
vector的优势在于查询

但是从实际使用来看,我觉得胡扯。然后,我个人喜欢vector,用的多

楼主的代码基本都是查询,不替换也没关系。
oyljerry 2012-08-25
  • 打赏
  • 举报
回复
直接改了以后,然后编译就可以看到是否有错误来对应的修改.
一般数据插入等,两者都支持
Eleven 2012-08-25
  • 打赏
  • 举报
回复
最大的差别一个可以随机存取,通过下标,一个必须遍历才能找到。vector替换成list应该不难的。
good luck~
healer_kx 2012-08-25
  • 打赏
  • 举报
回复
你的使用方式,似乎vector更好了。

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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