精華區beta C_and_CPP 關於我們 聯絡資訊
※ 引述《sinclair ( )》之銘言: : 最近剛開始接觸程式,覺得很有趣,但對C++的指令還很生疏, : 想請教大家一個問題。假設我需要讀取一個.txt檔, 檔案的內容如下: : NET n1 { c12 c78 }NET n2 { c190 c57 c76 c80 }NET n3 { c191 c59 } : 以上只是其中一小部份, 在讀完整個檔案之前,並不知道有多少個Net與cell : 我希望能用一個陣列Data[number of Net][number of cell]來記錄檔案的資料, : 我的想法是每次讀取一行字串,如"NET n1 { c12 c78 }", 當發現"Net n"就把緊跟 : 在後面的數字紀錄下來,得到'1',當發現c就記錄後面的數字,得到12與78。在讀取完 : 一個字串後將Data[0][11],Data[0][77]的內容紀錄為1, 讀取完第二個字串時 : 紀錄Data[1][189],Data[1][189],Data[1][56],Data[1][75],Data[1][79]為1, : 以此類推...  關於讀檔的問題,我已經寫出來了,附上程式碼如下,  但現在碰到一個問題。在還沒讀檔之前,  我不知道 Data[][]的陣列大小要設定多少, 就先宣告為Data[5000][5000], 請問能不能教我 如何用動態陣列或任何其他方法,在完成讀檔的動作後 使陣列大小剛好等於net(最大值)乘cell(最大值) 先謝謝大家不吝賜教! #include <iostream> #include <fstream> #include <iomanip> using namespace std; const int num_net=5000; const int num_cell=5000; int Data[num_net][num_cell]; void main() { char buffer=0; int temp=0; int net=0; int cell=0; fstream inFile; inFile.open("test.in"); while(!inFile.eof()) { inFile.get(buffer); if (buffer=='n')    { do { inFile.get(buffer); if (buffer=='c') { inFile >> temp; cell=temp; Data[net][cell-1]=1; } }while(buffer!='}'); net++; } } } -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 210.58.30.217
simata:int* Data = new int[net][ceil]; 61.231.65.225 09/01
> -------------------------------------------------------------------------- < 作者: khoguan (Khoguan Phuann) 看板: C_and_CPP 標題: Re: [問題] 請教C++讀檔&動態陣列的問題 時間: Thu Sep 1 01:58:57 2005 ※ 引述《sinclair ( )》之銘言: : ※ 引述《sinclair ( )》之銘言: : : 最近剛開始接觸程式,覺得很有趣,但對C++的指令還很生疏, : : 想請教大家一個問題。假設我需要讀取一個.txt檔, 檔案的內容如下: : : NET n1 { c12 c78 }NET n2 { c190 c57 c76 c80 }NET n3 { c191 c59 } : : 以上只是其中一小部份, 在讀完整個檔案之前,並不知道有多少個Net與cell : : 我希望能用一個陣列Data[number of Net][number of cell]來記錄檔案的資料, : : 我的想法是每次讀取一行字串,如"NET n1 { c12 c78 }", 當發現"Net n"就把緊跟 : : 在後面的數字紀錄下來,得到'1',當發現c就記錄後面的數字,得到12與78。在讀取完 : : 一個字串後將Data[0][11],Data[0][77]的內容紀錄為1, 讀取完第二個字串時 : : 紀錄Data[1][189],Data[1][189],Data[1][56],Data[1][75],Data[1][79]為1, : : 以此類推... 是不是要做出一個 matrix,裡頭的格子大部份都是 0 少部份是 1? :  關於讀檔的問題,我已經寫出來了,附上程式碼如下, :  但現在碰到一個問題。在還沒讀檔之前, :  我不知道 Data[][]的陣列大小要設定多少, : 就先宣告為Data[5000][5000], 請問能不能教我 : 如何用動態陣列或任何其他方法,在完成讀檔的動作後 : 使陣列大小剛好等於net(最大值)乘cell(最大值) 很堅持要用原始的 array 嗎?還是可以接受 std::vector 呢? 用 vector<vector<int> > 會好寫一點。用原始的 array 就要 先用 alloc() 函式來分配相當大、足夠大的空間出來,要 malloc() 兩次,第一次 malloc() 第一維,第二次 malloc() 第二維。讀入的過程,有一個 maxcell 變數在記錄最大的 cell 編號,讀完以後,就以此編號做為第二維的最大值,另外,所附 的程式中的 net 已經可以記錄最大的 net 數,所以第一維已經 沒問題了。 最後,就是做縮小陣列的動作,用 realloc() 剁掉多出來的部 份,也是要做兩次,一次是針對第一維,一次是針對第二維, 哪個先做都無妨。 至於用 vector<vector<int> > 的話,一開始是宣告成 vector<vector<int> > Data(5000, vecotr<int>(5000)); 後面的縮小動作,因為 vector 有現成的 vector::resize() 可用,就方便多了。 : #include <iostream> : #include <fstream> : #include <iomanip> : using namespace std; : const int num_net=5000; : const int num_cell=5000; : int Data[num_net][num_cell]; : void main() : { : char buffer=0; : int temp=0; : int net=0; : int cell=0; : fstream inFile; : inFile.open("test.in"); : while(!inFile.eof()) : { : inFile.get(buffer); : if (buffer=='n') :    { : do : { : inFile.get(buffer); : if (buffer=='c') : { : inFile >> temp; : cell=temp; : Data[net][cell-1]=1; : } : }while(buffer!='}'); : net++; : } : } : } -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 220.130.208.168
sinclair:謝謝!我大概知道怎麼宣告動態多維陣列了.. 210.58.30.217 09/02
sinclair:請問用vector要如何resize呢? 謝謝! 210.58.30.217 09/02
> -------------------------------------------------------------------------- < 作者: sinclair ( ) 看板: C_and_CPP 標題: Re: [問題] 請教C++讀檔&動態陣列的問題 時間: Fri Sep 2 00:57:05 2005 想要再請教幾個問題,假設我要宣告一個動態一維陣列, 它的內容可能如下, { 1,7,12,15,26,31,34 }, 長度是7 1. 我可能把15從陣列中移除,使長度變成6, 2. 或是加入19, 使長度變成8, 並且將19排序在適當的位置如下, { 1,7,12,15,19,26,31,34 } 請問有沒有比較方便的宣告方式,讓我在進行上述 的資料處理時比較有效率。謝謝! -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 210.58.30.217
SHBK:vector or linked list 我只想到這兩個 163.13.128.240 09/02
cppOrz:雖然你說「動態一維陣列」,不過根據你的用法, 59.120.214.120 09/02
cppOrz:應該是直接用 std::set 或 std::multiset 就好了 59.120.214.120 09/02
freaky:需要排序的話的確使用 set 是比較好的選擇 203.70.36.38 09/02
> -------------------------------------------------------------------------- < 作者: khoguan (Khoguan Phuann) 看板: C_and_CPP 標題: Re: [問題] 請教C++讀檔&動態陣列的問題 時間: Fri Sep 2 01:13:54 2005 前一篇推文問的,vector 如何 resize 的問題: vector<vector<int> > Data(5000, vecotr<int>(5000)); 決定了 max_cellnum 後, for (int i = 0; i < 5000; ++i) { Data[i].resize(max_cellnum); } 就可以了。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 220.130.208.167
sinclair:請問當resize之後,原本Data的內容會不會消失 210.58.30.217 09/02
sinclair:我指的是維度還沒被刪掉的部份之內容 210.58.30.217 09/02
freaky:原來的資料還會保留, 超過size()的部份會被抹去 203.70.36.38 09/02
freaky:如果resize()長度比原來size()多, 新加的元素 203.70.36.38 09/02
freaky:會以預設值初始化(default initialized) 203.70.36.38 09/02
> -------------------------------------------------------------------------- < 作者: freaky (jon) 看板: C_and_CPP 標題: Re: [問題] 請教C++讀檔&動態陣列的問題 時間: Fri Sep 2 01:39:23 2005 ※ 引述《sinclair ( )》之銘言: : 想要再請教幾個問題,假設我要宣告一個動態一維陣列, : 它的內容可能如下, { 1,7,12,15,26,31,34 }, 長度是7 : 1. 我可能把15從陣列中移除,使長度變成6, : 2. 或是加入19, 使長度變成8, 並且將19排序在適當的位置如下, : { 1,7,12,15,19,26,31,34 } : 請問有沒有比較方便的宣告方式,讓我在進行上述 : 的資料處理時比較有效率。謝謝! 如果會有插入或刪除動作的, 最好是用 list. vector 內部實作其實還是配置一塊固定大小的記憶體空間, 用 capacity() 可以得知其大小. 當 size() = capacity() 時, 插入任何元素就會導致重新配置 記憶體空間 (reallocation), 將舊的元素複製到新配置的記憶體 空間內, 再清除舊的記憶體空間. 使用 reserve() 保留夠多的記憶體空間可以避免不必要的 reallocation, 但是浪費記憶體. -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 203.70.36.38 > -------------------------------------------------------------------------- < 作者: sinclair ( ) 看板: C_and_CPP 標題: Re: [問題] 請教C++讀檔&動態陣列的問題 時間: Fri Sep 2 21:56:51 2005 ※ 引述《freaky (jon)》之銘言: : ※ 引述《sinclair ( )》之銘言: : : 想要再請教幾個問題,假設我要宣告一個動態一維陣列, : : 它的內容可能如下, { 1,7,12,15,26,31,34 }, 長度是7 : : 1. 我可能把15從陣列中移除,使長度變成6, : : 2. 或是加入19, 使長度變成8, 並且將19排序在適當的位置如下, : : { 1,7,12,15,19,26,31,34 } : : 請問有沒有比較方便的宣告方式,讓我在進行上述 : : 的資料處理時比較有效率。謝謝! : 如果會有插入或刪除動作的, 最好是用 list. : vector 內部實作其實還是配置一塊固定大小的記憶體空間, : 用 capacity() 可以得知其大小. : 當 size() = capacity() 時, 插入任何元素就會導致重新配置 : 記憶體空間 (reallocation), 將舊的元素複製到新配置的記憶體 : 空間內, 再清除舊的記憶體空間. : 使用 reserve() 保留夠多的記憶體空間可以避免不必要的 : reallocation, 但是浪費記憶體. 謝謝大家不吝賜教,我目前大概只會一些基礎的指令, 對物件和類別等觀念幾乎是零,但是想要在短時間內完成 我想實現的演算法,只能夠先請教大家一些較高階的指令。 以後再慢慢把這些觀念補回來。 上網搜尋之後,我大概知道如何用vector來完成我想進行的動作了, 但既然大家建議用list比較好,能不能簡單介紹一下 list 如何應用 以下是目前我用vector寫好的一些應用。 vector<int> GroupB; for (i=0; i<SizeB; i++) // 填入陣列初值,假設 SizeB=7 GroupB.push_back(SizeB+i); GroupB.push_back(3); //插入並排序 sort(GroupB.begin(), GroupB.end()); 如果要刪除陣列中的某個元素,不知道list要怎麼用會比vector方便 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.113.218.204