[問題] 自定義排序的規則

作者: googled (15357)   2015-01-13 14:11:51
各位前輩好,小弟有一個問題想請教各位高手
假設說今天我程式跑一個迴圈後,會取得多筆字串,
並且存在容器(vector、list皆可)裡,例如存到conditionVector
假設取得的字串是:"111"、"10"、"50"、"30"、"200"
接著程式就要去讀取data,例如讀近來的資料存到dataVector
假設讀近來的資料是:"10"、"111"、"200"、"50"、"800"
我想請問的是,
有什麼方法可以快速且有效率去依照conditionVector的順序來排序
而conditionVector沒有的string就捨去
例如dataVector排序好後會變成"111"、"10"、"50"、"200"
我目前的方法是
vector<string> sortVector
for(auto conIter: conditionVector)
for(auto dataIter: dataVector)
if( conIter == dataIter ){
sortVector.push_back(dataIter);
break;
}
這方法雖然可行,可是效率極差@@
因為我conditionVector跟dataVector也許會有幾千、幾萬筆
本來想說把dataVector改存成unsorted_set,用find的方式來加速收尋
雖然有比較快,可是insert跟find的部分卻花了太多時間
所以想請教各位高手能否指導一下小弟是否有更快速的方法
感謝各位
作者: BlazarArc (Midnight Sun)   2015-01-13 14:28:00
用 condition.find(currentData) 紀錄 index 再依據
作者: uranusjr (←這人是超級笨蛋)   2015-01-13 14:28:00
把 conditionVector 裡面的東西做成 map
作者: BlazarArc (Midnight Sun)   2015-01-13 14:29:00
index搜尋? 至少複雜度不是走訪整個condition依據 index sort, 說錯condition 可用 std::unordered_set
作者: CaptainH (Cannon)   2015-01-13 15:27:00
不是應該用set就好了嗎
作者: uranusjr (←這人是超級笨蛋)   2015-01-13 15:32:00
顛倒, dataVector 裡面的東西要是 key, 然後用找出來的值排序(應該要寫個 compare function 會比較方便)
作者: BlazarArc (Midnight Sun)   2015-01-13 15:33:00
我想錯了 腦袋不清楚 XDcondition有order要求 不能用 unordered set可以用map 保持排序 而用map的value當index, 2樓正解不過你data的內容會重複出現嗎? 要求似乎只要標記那些condition 有出現在 data 裡面?如果是這樣那 value type bool 用來標記就好對啊 沒必要再排序吧?
作者: uranusjr (←這人是超級笨蛋)   2015-01-13 16:06:00
用內建的 sort 然後自己給一個 Compare objecthttp://www.cplusplus.com/reference/algorithm/sort/不存在的就給他一個超大值丟到最後面, 最後再一次清掉不過如果不存在的值會很多, 自己寫一個 sort 可能更好
作者: googled (15357)   2015-01-15 01:09:00
成功做出來了,速度的確提升不少,感謝各位前輩

Links booklink

Contact Us: admin [ a t ] ucptt.com