[问题] 自定义排序的规则

楼主: 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