為什麼這篇動態陣列大小鄉民發文收入到精華區:因為在動態陣列大小這個討論話題中,有許多相關的文章在討論,這篇最有參考價值!作者sinclair ( )看板C_and_CPP標題Re: [問題] 請教C++讀檔&am...
※ 引述《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
> -------------------------------------------------------------------------- <
作者: 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 ( ) 看板: 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
> -------------------------------------------------------------------------- <
作者: 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
> -------------------------------------------------------------------------- <
作者: 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