[問題] list vector之間的取捨

看板C_and_CPP作者 (orz811017)時間10年前 (2014/04/10 02:31), 編輯推噓6(6018)
留言24則, 8人參與, 最新討論串1/1
學校作業有一個題目裡面會遇到一個問題 就是要在一個已經排序過的數列 在插入一個數值進去 插入之後還是排序好的 我想大概是二分搜尋之後插入就好 所以整體應該會O(logN)這樣 我一開始用Vector寫一寫 寫到後面發現 Vector的insert是O(N) 就換成List來寫 可是寫一寫發現 我用STL::upper_bound很慢 (我以為是O(LogN)) 可是查了一下 因為iterator的關係 他會退化成O(N) 想想好像也對 List好像沒辦法像Vector一樣直接跳到我想要的位置 (要從頭一個一個走.... 想請問這個問題有解嗎?? -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.113.66.45 ※ 文章網址: http://www.ptt.cc/bbs/C_and_CPP/M.1397068306.A.53B.html

04/10 02:37, , 1F
map
04/10 02:37, 1F

04/10 02:38, , 2F
這叫所謂的 「答非所問」嗎 XD
04/10 02:38, 2F

04/10 02:42, , 3F
map嗎 我等等去研究一下 我跟他實在不是很熟QQ
04/10 02:42, 3F

04/10 02:43, , 4F
我剛剛原本想說自己寫一個Binarysearch
04/10 02:43, 4F

04/10 02:43, , 5F
結果跑更慢....後來想了想才發現好像有這樣的問題= =
04/10 02:43, 5F

04/10 02:44, , 6F
要也是 set 為什麼會回答 map 呢...
04/10 02:44, 6F

04/10 02:45, , 7F
啊, 如果數字會重覆的話或許要用 multiset
04/10 02:45, 7F

04/10 02:46, , 8F
set (map 也是) 底層通常是紅黑樹, 插搜刪都是 O(logN)
04/10 02:46, 8F

04/10 03:34, , 9F
因為set可做的事map也能做到,複雜度也一樣
04/10 03:34, 9F

04/10 10:50, , 10F
set or map有sort嗎
04/10 10:50, 10F

04/10 10:53, , 11F
謝謝 我剛起床看了一下 set本身就是排序過的容器~
04/10 10:53, 11F

04/10 10:53, , 12F
所以insert的時候就會幫妳合適位置放了~~
04/10 10:53, 12F

04/10 11:36, , 13F
看需求,heap 也是可以。
04/10 11:36, 13F

04/10 12:20, , 14F
set/map都是sorted(ordered) C++11以後才有unordered_
04/10 12:20, 14F

04/10 12:21, , 15F
因為ordered通常都用operator<來排 而unordered則用
04/10 12:21, 15F

04/10 12:22, , 16F
hash_value() 以效率來講的話前者某些class會碰到點瓶頸
04/10 12:22, 16F

04/10 12:22, , 17F
但是後者則要自己寫好::hash_value()
04/10 12:22, 17F

04/10 12:23, , 18F
你要注意一下你的「排序」定義跟他實際上編譯器幫你
04/10 12:23, 18F

04/10 12:23, , 19F
invoke到的operator<是不是行為如你所預期 這很重要
04/10 12:23, 19F

04/10 12:24, , 20F
有時候他的operator<並不如你想像中的直觀
04/10 12:24, 20F

04/10 12:25, , 21F
(其實推文主要是想要提醒operator<的潛在陷阱而已)
04/10 12:25, 21F

04/10 13:32, , 22F
如果input和output階段分得很清楚 用vector較好
04/10 13:32, 22F

04/10 13:33, , 23F
如果input和output動作非常混雜 用set比較好
04/10 13:33, 23F

04/13 10:52, , 24F
恩恩 我另一個問題中也有遇到operator的問題 謝謝囉
04/13 10:52, 24F
文章代碼(AID): #1JHP8IKx (C_and_CPP)