看板 C_and_CPP 關於我們 聯絡資訊
不好意思,各位前輩 有個問題想請教 我先宣個一個vector 然後輸入數字到裡面 接下來再宣個一個動態陣列並且把值複製進來 最後列印 我編譯都過了...但是程式執行時卻會出現一堆亂碼 邏輯上我也不知道自己有哪邊想法有錯 可否能請前輩指點一下 因為想練習寫的比較嚴謹 所以int 我都宣告成signed int 先謝謝了~ #include<iostream> #include<vector> using std::cin; using std::cout; using std::endl; using std::vector; bool main( int argc , char *argv[] ) { vector<int> v; size_t i=0; //計數 signed int g; //儲存輸入 while(cin >> g) { v.push_back(g); } //用兩個指標相減得vector長度 vector<int>::iterator p = v.begin(); vector<int>::iterator q = v.end(); vector<int>::difference_type x = q - p; //型別轉換 difference_type轉size_t for(vector<int>::difference_type a = 0 ; a != x ; ++a ) { i=i+1; } signed int *k = new signed int[i]; //宣告動態陣列 for( p , k ; p != q ; ++p , ++k ) //複製 { *k = *p; } for( signed int j=0 ; j != i ; ++j ) //列印 { cout << *(k+j); } delete [] k; return true; } -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 61.20.128.34
james732:vector 長度其實可以用 v.size() 取得 11/27 12:02
snoopy0907:可是型別不是vector<int>::size_type嗎?可以直接轉換 11/27 12:08
ledia:size_type is an unsigned integral type 11/27 12:08
snoopy0907:可以直接轉換成動態陣列裡的size_t型別嗎? 11/27 12:09
ledia:是說為什麼要轉 array 呢? vector 也有 [] 可以用呀 11/27 12:09
snoopy0907:想多練習兩者之間轉換,畢竟很多程式還是用陣列寫 11/27 12:12
snoopy0907:現在我不懂的是為啥c++要設這麼多型別名稱 11/27 12:14
snoopy0907:可是很多好像都互通...真亂 11/27 12:14
VictorTom:"為啥c++要設這麼多型別名稱", 關於這個問題.... 11/27 12:19
VictorTom:早期的程式工作者, 常常寫程式都在開發重覆然後略為不同 11/27 12:20
VictorTom:的輪子, C++則提供給你了汎用的輪子, 方便你省去很多重 11/27 12:20
VictorTom:覆的coding, 而且這些汎用輪子多半經過了相當程度的精鍊 11/27 12:21
VictorTom:所以可靠性甚至效率可能都勝過你自己重頭寫過一個.... 11/27 12:21
VictorTom:您會有這樣的問題, 代表您寫的程式/處理過的問題還不夠 11/27 12:21
VictorTom:多, 所以您分不出來哪些型別有什麼差在什麼地方才好用; 11/27 12:22
VictorTom:等到實作的經驗一多(不是作業寫多了, 是像專題等比較大 11/27 12:22
VictorTom:型的專案, 或比較不同的領域問題遇多了)才會慢慢覺得這 11/27 12:23
VictorTom:些人家幫你寫好的型別好用在哪裡:) 11/27 12:23
snoopy0907:謝謝V大的說明~不過小弟我的確是程式經驗尚淺 11/27 12:25
snoopy0907:就是每天多練習寫才能進步了 11/27 12:25
VictorTom:另外, 以這個例子來說如果是純為了練習是沒有關係, 因為 11/27 12:27
VictorTom:看起來像在模擬class內部實作; 如果只是要學著操作 11/27 12:27
VictorTom:vector就有點多此一舉了, 像3/5F l大說的那樣, 直接透過 11/27 12:28
VictorTom:class提供的method來操作, 會比較符合C++的精神:) 11/27 12:28
jlovet:是不是可以用algorithm std::copy 11/27 12:34
snoopy0907:這是C++PRIMER練習4_28這本題目都很重觀念 11/27 12:35
ssagit:對出現亂碼的原因是, 因為 k 的值已經跑掉了, 不是原本 new 11/27 12:44
ssagit:出來那個陣列的開頭.... 11/27 12:44
ssagit:所以後面列印 k[] 和 delete [] k 的動作都很危險.... 11/27 12:45
VictorTom:原來還沒注意到k++已經讓new回來的k[]頭給搞丟了Orz 11/27 13:05
snoopy0907:感謝~size()跟我原先的方式都成功寫出來了:) 11/27 13:42
tinlans:我用過的平台普遍 size_type 跟 size_t 會通,不怕死的話 11/27 14:45
tinlans:就用 size_t 也行。 11/27 14:45