作者BearTsao (外行人)
看板C_and_CPP
標題[問題] STL(Vector, List) push_back失效?
時間Sat Jan 28 15:56:28 2012
開發平台(Platform): (Ex: VC++, GCC, Linux, ...)
VC++
額外使用到的函數庫(Library Used): (Ex: OpenGL, ...)
STL
餵入的資料(Input):
我想要從文字檔讀入下列格式的資料
1 5 2 3 8
由左至右為: 編號1的顧客的交易編號為2, 交易長度為2(有兩筆資料) 資料分別為 5, 8
程式碼(Code):(請善用置底文網頁, 記得排版)
先宣告
struct Node
{
int Customer; //顧客編號
vector <int> Data; //存放顧客交易資料
};
struct TransList
{
int Transaction; //交易編號
int Length; //交易長度
int *item; //交易資料
}:
struct Node *ShowPtr;
struct TransList *List1;
首先建一個Node來儲存顧客的交易資料, 接著從文字檔中讀入資料
inFile.read ((char*) &List1->Transaction, sizeof (int)); // 第N筆資料
inFile.read ((char*) &List1->Length, sizeof (int)); // 有資料長度為M
List1->item = (int*) calloc (List1->Length, sizeof(int));
for (i = 0 ; i < List1->Length; a++)
{
inFile.read ((char*) &List1->item[i], sizeof (int)); // 資料
}
故此時應為 List1->Transaction = 5, List1->Length = 2, List1->item[0] = 3,
List1->item[1] = 8
-----------------------------------------------------------------------------------------------------------------------
主要問題是這部分, 準備用另一個副程式存入顧客的Vector
ShowPtr->Data.reserve(50); // 因push_back或erase會使iterators失效, 所以先預設
容量, 以防iterators失效
vector <int> ::iterator ivec1;
while (List1 != NULL)
{
for (int i = 0; i < 該顧客有幾筆交易; i++) // 假設只有一筆交易
{
for (int j= 0; j < List1->Length ; j++)
{
ShowPtr->Data.push_back(List1->item[j]);
}
ShowPtr->Data.push_back(-1); // 用來表示第一筆交易讀完
}
ShowPtr->Data.push_back(-2); // 用來表示 該顧客交易全讀完
}
所以顧客的Vector 應存放著 3 8 -1 -2
然後我用ivec1指向ShowPtr->Data.begin(); 此時*ivec1 應為 3
卻還是出現iterators失效, 我有先預設容量可放50筆資料, 目前只放4筆(3 8 -1 -2) 照
理Vector不用重新分配記憶體, 但iterators卻還是失效
補充說明(Supplement):
另外後來想改用List (想說不用擔心iterators失效的問題), 反而還出現0xC0000005「違
反記憶體使用權」的錯誤的產生
以上兩個問題, 勞請各位版友解惑了...
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.134.18.157
→ akasan:STL 不能直接這樣讀寫, 會無法正確初始化 01/28 16:06
→ akasan:keyword "c++ stl serialization" 01/28 16:06
→ BearTsao:不太懂(直接讀寫?), 不過感謝樓上給keyword 01/28 16:15
→ diabloevagto:你要不要把你的程式弄成一個可以跑得...有點看不太懂 01/28 16:28
→ akasan:oop, 發現看太快有所誤會XD 不過關鍵字應該是有用的 01/28 16:29
→ akasan:ShowPtr 不會是弄成 calloc 要記憶體了吧? 01/28 16:31
→ BearTsao:如果讀到新的顧客,會calloc一塊記憶體,存放該顧客vector 01/28 16:44
→ akasan:C++ 請用 new 01/28 16:52
→ BearTsao:還是Vector只能放純數值,不能放指標List1->item[i]? 01/28 16:53
推 littleshan:你用純文字存資料,怎麼會用read來讀取咧 01/28 16:58
→ littleshan:inFile >> List1->Transaction 這樣才對吧 01/28 16:59
→ BearTsao:改用new 和 >> 試試 @@ 01/28 17:07
→ BearTsao:說錯了, 我是讀binary @@ 01/28 17:38
→ diabloevagto:你在push_back裡面放入showptr->item,但是你的 01/28 18:10
→ diabloevagto:是node,裡面那來的item? 01/28 18:11
→ diabloevagto:是不是該用list1->item[j] 01/28 18:11
※ 編輯: BearTsao 來自: 140.134.18.155 (01/28 18:25)
→ BearTsao:漏掉, 忘了改@@ 01/28 18:26
→ diabloevagto:你要不要把能跑的程式貼上來...這樣比較好找問題 01/28 18:33
→ WJAider:我只是單純不喜歡後面補 -1 & -2 的規則...很 C... 01/28 19:11
→ WJAider:在插入資料時, ivec1 完全沒有動到 01/28 19:14
→ WJAider:所以應該不是記憶體位置問題 01/28 19:14
→ WJAider:把 ivec1 = ShowPtr->Data.begin(); 那部分程式碼貼上吧 01/28 19:15
→ diabloevagto:他有用上push_back 01/28 20:09
→ blackwindy:你應該用new,只有malloc的話vector會初始化嗎? 01/28 20:30
→ diabloevagto:我覺得架構怎麼不用vector就好,裡面不要放int,放你 01/28 20:34
→ diabloevagto:所需要的class就好 01/28 20:34
→ BearTsao:可行了, 沒想到new 和 calloc 會影響這麼大@@ 01/29 17:03