[問題] vector 使用問題

看板C_and_CPP (C/C++)作者 (西木野真姬)時間4年前 (2020/09/07 12:35), 4年前編輯推噓8(8021)
留言29則, 8人參與, 4年前最新討論串1/1
開發平台(Platform): (Ex: Win10, Linux, ...) mac 編譯器(Ex: GCC, clang, VC++...)+目標環境(跟開發平台不同的話需列出) c17 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) null 問題(Question): 想要 new vector<int>() 之後 access vector 餵入的資料(Input): null 預期的正確結果(Expected Output): 1 錯誤結果(Wrong Output): 沒有運算子 "=" 符合這些運算元 -- 運算元類型為: std::__::vector<int,::std::__1::allocator<int>> = int 程式碼(Code):(請善用置底文網頁, 記得排版,禁止使用圖檔) vector<int> *v; v = new vector<int>(5); v[2] = 1; // 這裡開始錯 cout << v[2]; 補充說明(Supplement): 剛開始從 C 轉 C++,很不習慣用已經寫好的東西(不懂裡面怎麼運作QQ) 1. 我在想是不是因為 vector 因為是動態的,記憶體位址跟陣列不一樣,不會連續配置 所以我宣告 vector 指標之後,v[2] 就真的是 v 記憶體位置開始的第三格,而不是真正意義上 vector 資料結構的第三格 2. 這樣就牽扯到 vector 內部怎麼寫,所以想在請問一下 vector 內部是不是像 linked list 一樣? 這樣 random access 是不是需要 O(n)? 3. 另外想問一下有沒有什麼資源是適合熟悉C語言,要轉 C++ 的。我目前是看 cplusplus.com 裡面一個一個看他的語法/機制,但內部怎麼運作還是不懂 (像是 set 我上網查才知道裡面好像是用 rbtree,為何不用 graph???複雜度應該更好) 不然就是去 github 上直接看C++資料結構的code(以前都用C自己刻,所以想說直接看C++怎麼刻會學比較快) -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 1.171.184.16 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1599453301.A.B2D.html

09/07 13:01, 4年前 , 1F
1.你應該誤會vector怎麼用了吧,我猜你要的只是vector<int
09/07 13:01, 1F

09/07 13:01, 4年前 , 2F
> v(5),不需要用new的
09/07 13:01, 2F
我原本是寫在 class 裡面,初始化的時候給參數才決定 vector 大小

09/07 13:04, 4年前 , 3F
2. vector底層實作基本上就是array,能夠O(1) push_back原
09/07 13:04, 3F
那這樣我為何不能 new 之後直接 access v[2] ?

09/07 13:04, 4年前 , 4F
因則是他會自動在底層陣列滿的時候自動再重新把陣列變大,
09/07 13:04, 4F

09/07 13:04, 4年前 , 5F
但這樣做複雜度均攤下來還是好的
09/07 13:04, 5F

09/07 13:05, 4年前 , 6F
(無關的部分:可以問用圖存set該怎麼做嗎?
09/07 13:05, 6F
不是用 union-by-rank + path compression 嗎? (其實說是 graph,但其實就 tree 只是不是平常寫的 tree) ※ 編輯: NTUmaki (1.171.184.16 臺灣), 09/07/2020 13:14:09 啊 應該說 disjoint set啦,跟數學的 graph有點搞在一起了>< ※ 編輯: NTUmaki (1.171.184.16 臺灣), 09/07/2020 13:17:03 ※ 編輯: NTUmaki (1.171.184.16 臺灣), 09/07/2020 13:19:17

09/07 14:10, 4年前 , 7F
https://bit.ly/35gCesP 看看這篇有沒有幫助?
09/07 14:10, 7F

09/07 14:11, 4年前 , 8F
你需要的可能是先預留空間?
09/07 14:11, 8F

09/07 15:09, 4年前 , 9F
v是pointer to vector. 並沒有告訴你會直接指到underly
09/07 15:09, 9F

09/07 15:09, 4年前 , 10F
ing data.
09/07 15:09, 10F

09/07 15:12, 4年前 , 11F
直接改寫的話 你得用(*v)[2]=1;
09/07 15:12, 11F
嗯嗯 所以vector的變數名稱不能跟陣列一樣當成位址

09/07 15:24, 4年前 , 12F
你需要 "C++ 標準庫", 買一本來參考
09/07 15:24, 12F

09/07 15:26, 4年前 , 13F
書上用了 11 頁在說明 vector, 應該可以解除你的疑惑
09/07 15:26, 13F

09/07 15:29, 4年前 , 14F
你如果是要理解內部實作, 那要找 "stl 源碼剖析" 這本書
09/07 15:29, 14F
感謝!

09/07 15:54, 4年前 , 15F
樓上 *v正解
09/07 15:54, 15F
所以vector沒有預設把變數名稱當位址沒錯吧?

09/07 16:41, 4年前 , 16F
disjoint set沒ordering吧(? 可是associative contain
09/07 16:41, 16F

09/07 16:41, 4年前 , 17F
ners的iterator traversal要參照其key的ordering
09/07 16:41, 17F

09/07 16:42, 4年前 , 18F
加上標準也有指定一些複雜度限制
09/07 16:42, 18F

09/07 16:42, 4年前 , 19F
可能是因為這樣所以常見的都用rb-tree
09/07 16:42, 19F
好的 感謝... ※ 編輯: NTUmaki (27.247.233.249 臺灣), 09/07/2020 16:43:00 ※ 編輯: NTUmaki (27.247.233.249 臺灣), 09/07/2020 16:43:21 ※ 編輯: NTUmaki (27.247.233.249 臺灣), 09/07/2020 16:43:55 ※ 編輯: NTUmaki (27.247.233.249 臺灣), 09/07/2020 16:44:21

09/07 16:56, 4年前 , 20F
v本身是pointer, 不能把它當vector去access, c的pointer
09/07 16:56, 20F

09/07 16:56, 4年前 , 21F
可以操作 v[2] 只是語法糖,不適用vector, (*v)[2] 或 v
09/07 16:56, 21F

09/07 16:56, 4年前 , 22F
->at(2) 才正確
09/07 16:56, 22F
了解!感謝 ※ 編輯: NTUmaki (27.247.233.249 臺灣), 09/07/2020 17:41:09

09/07 22:03, 4年前 , 23F
說實在我還是不知道要怎麼用disjoint set當作set,是我誤
09/07 22:03, 23F

09/07 22:04, 4年前 , 24F
會了甚麼嗎@@,應該說這兩者根本沒關吧,而且disjoint set
09/07 22:04, 24F

09/07 22:04, 4年前 , 25F
其實也是棵樹
09/07 22:04, 25F

09/07 22:08, 4年前 , 26F
我覺得正確的說法應該是v[??]後的type是vector<int>,所以
09/07 22:08, 26F

09/07 22:09, 4年前 , 27F
你讓他=2是完全沒有道理的,普通的陣列int *a; a[?]的type
09/07 22:09, 27F

09/07 22:09, 4年前 , 28F
是int,那這時候=2當然是合法的操作
09/07 22:09, 28F

09/11 17:51, 4年前 , 29F
這...應該用個v.resize()就解決了吧...
09/11 17:51, 29F
文章代碼(AID): #1VLRXrij (C_and_CPP)
文章代碼(AID): #1VLRXrij (C_and_CPP)