線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1211
推到 Plurk!
推到 Facebook!

在回圈中移除和增加vector的問題

答題得分者是:malanlk
achillean
一般會員


發表:16
回覆:23
積分:7
註冊:2004-08-13

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-08-26 01:18:04 IP:211.74.xxx.xxx 未訂閱
Question 1:    http://delphi.ktop.com.tw/topic.php?topic_id=20390 參考過後這篇 只是在內文中間的delete *i  我以為應該是delete i ,因為i本身已經是指標 請前輩指點    Question 2:    struct FaceArea{         vertx verts[3];   //點的自訂結構內有X,Y,Z座標         int verts_id[3];  //點的編號         float area;       //面積 };//一個面三點構成    vector Vec_GDFArea; int GDnVertx; //目前點標號max //以下是把面積過大的面,以重心切割成三塊,在放回vector,並把過大的面宜除 //請檢查一下在這樣的回圈結構中,移除和放入vector是否有問題 //因為作這個手續之前,所有處理Vec_GDFArea的副程式都運作正常 //但是加上這個副程式之後,在處理到新加入的面和編號的副程式會出點問題 //如果需要什麼地方的說明,我會再補上,謝謝各位
for(unsigned i=0;i threshold_area )
     {
            GDnVertx;
          for(unsigned n=0;n<3;n  )
          {
                new_Area.verts[0]=Vec_GDFArea[i].verts[n];
                new_Area.verts[1]=Vec_GDFArea[i].verts[(n 1)%3];
                new_Area.verts[2]=GetCP(Vec_GDFArea[i]);                    new_Area.verts_id[0]=Vec_GDFArea[i].verts_id[n];
                new_Area.verts_id[1]=Vec_GDFArea[i].verts_id[(n 1)%3];
                new_Area.verts_id[2]=GDnVertx;                    new_Area.area=GetArea(new_Area);                    Vec_GDFArea.push_back(new_Area);
          }
          Vec_GDFArea.erase(&Vec_GDFArea[i--]);
     }
}
補充說明原本回圈中的元素我是用vector::iterator it來作指標 所以移除元素的時候我是用Vec_GDFArea.erase(it--); 在question 1中的文章已經說明這樣是有問題的 我也使用過F8來一步一步看new_Area的確當vector跑到後面新加入的元素 跟先前push_back的new_Area是不一樣的值 所以才改用現在這種寫法不使用指標 在其他副程式出錯的時候是出現Access violation錯誤 我想是因為存取到無效的記憶體,那就應該是我所提出的問題點 發表人 - achillean 於 2005/08/26 01:27:51
malanlk
尊榮會員


發表:20
回覆:694
積分:577
註冊:2004-04-19

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-08-26 09:32:29 IP:203.69.xxx.xxx 未訂閱
Question 1    i 的內容也是指標, 指向 某ㄧ元素的位址 而要刪除的是 該元素 所以是 delete *i    Question 2    1. List 配置出來的空間並不是連續的, 你用 Array 來操作 List 得到 Access violation access 是應該的..... List 的 ++, -- 運算應該是在做 Next, Prior 的動作, 而不是 Array 的單純位址位移.... 2. "所以移除元素的時候我是用Vec_GDFArea.erase(it--)"  為什麼要放 "--" ? 當你做erase(it) 時 這個項目就被丟掉了, 如何 Prior? 而且用 erase 會

// 要不然得馬上 break,否則 i 的值馬上變成無效值
// i   就會出問題
3 .如果照 delete *i; *i=NULL; 的概念, 只要將 *i 所指的元素 delete 掉就是收回 元素所佔用的記憶體, 接著再挪向下一個iterator做就可以了...
系統時間:2024-05-11 19:57:42
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!