[問題] STL(Vector, List) push_back失效?

看板C_and_CPP作者 (外行人)時間14年前 (2012/01/28 15:56), 編輯推噓1(1026)
留言27則, 6人參與, 最新討論串1/1
開發平台(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

01/28 16:06, , 1F
STL 不能直接這樣讀寫, 會無法正確初始化
01/28 16:06, 1F

01/28 16:06, , 2F
keyword "c++ stl serialization"
01/28 16:06, 2F

01/28 16:15, , 3F
不太懂(直接讀寫?), 不過感謝樓上給keyword
01/28 16:15, 3F

01/28 16:28, , 4F
你要不要把你的程式弄成一個可以跑得...有點看不太懂
01/28 16:28, 4F

01/28 16:29, , 5F
oop, 發現看太快有所誤會XD 不過關鍵字應該是有用的
01/28 16:29, 5F

01/28 16:31, , 6F
ShowPtr 不會是弄成 calloc 要記憶體了吧?
01/28 16:31, 6F

01/28 16:44, , 7F
如果讀到新的顧客,會calloc一塊記憶體,存放該顧客vector
01/28 16:44, 7F

01/28 16:52, , 8F
C++ 請用 new
01/28 16:52, 8F

01/28 16:53, , 9F
還是Vector只能放純數值,不能放指標List1->item[i]?
01/28 16:53, 9F

01/28 16:58, , 10F
你用純文字存資料,怎麼會用read來讀取咧
01/28 16:58, 10F

01/28 16:59, , 11F
inFile >> List1->Transaction 這樣才對吧
01/28 16:59, 11F

01/28 17:07, , 12F
改用new 和 >> 試試 @@
01/28 17:07, 12F

01/28 17:38, , 13F
說錯了, 我是讀binary @@
01/28 17:38, 13F

01/28 18:10, , 14F
你在push_back裡面放入showptr->item,但是你的
01/28 18:10, 14F

01/28 18:11, , 15F
是node,裡面那來的item?
01/28 18:11, 15F

01/28 18:11, , 16F
是不是該用list1->item[j]
01/28 18:11, 16F
※ 編輯: BearTsao 來自: 140.134.18.155 (01/28 18:25)

01/28 18:26, , 17F
漏掉, 忘了改@@
01/28 18:26, 17F

01/28 18:33, , 18F
你要不要把能跑的程式貼上來...這樣比較好找問題
01/28 18:33, 18F

01/28 19:11, , 19F
我只是單純不喜歡後面補 -1 & -2 的規則...很 C...
01/28 19:11, 19F

01/28 19:14, , 20F
在插入資料時, ivec1 完全沒有動到
01/28 19:14, 20F

01/28 19:14, , 21F
所以應該不是記憶體位置問題
01/28 19:14, 21F

01/28 19:15, , 22F
把 ivec1 = ShowPtr->Data.begin(); 那部分程式碼貼上吧
01/28 19:15, 22F

01/28 20:09, , 23F
他有用上push_back
01/28 20:09, 23F

01/28 20:30, , 24F
你應該用new,只有malloc的話vector會初始化嗎?
01/28 20:30, 24F

01/28 20:34, , 25F
我覺得架構怎麼不用vector就好,裡面不要放int,放你
01/28 20:34, 25F

01/28 20:34, , 26F
所需要的class就好
01/28 20:34, 26F

01/29 17:03, , 27F
可行了, 沒想到new 和 calloc 會影響這麼大@@
01/29 17:03, 27F
文章代碼(AID): #1F8wenZY (C_and_CPP)