我遇到了一個問題,我需要存盤兩個值,一個 id 和另一個它的影響,并且 id 應該是隨機訪問的。也應該根據影響力排序,如果兩個影響力相同,則根據id排序。考慮到這些事情,我使用了地圖,但有沒有辦法實際做到這一點?
我在比較器和地圖下方嘗試過,但它給出了錯誤
struct cmp
{
bool comparator()(const pair<int,int>a,const pair<int,int>b)
{
if(a.second==b.second) return a.first<b.first;
else return a.second<b.second;
}
};
unordered_map<int,int,cmp>m;
uj5u.com熱心網友回復:
據我了解,您想要一個按一個值排序但可以快速被另一個值索引的集合。這兩點是矛盾的。按鍵值對集合進行排序可以更快地按該鍵值進行索引。沒有簡單的方法可以同時以兩種不同的方式快速索引一個集合。請注意,我說的是“快速可索引”,而不是談論隨機訪問。那還是一個不同的概念。
簡而言之,您需要兩個集合。您可以有一個存盤影響-ID 對并按影響排序的主存盤,以及一個存盤 ID 并將它們映射到主集合的輔助存盤。有很多選擇;這是一個:
std::set<std::pair<int,int>> influences;
std::unordered_map<int, decltype(influences)::iterator> ids;
插入影響-ID 對時,您可以先插入influence,然后將迭代器帶到該新元素并插入帶有 ID 的元素。
另一種解決方案是保留影響-ID 對的主要集合,但這次按 ID 排序(并在需要從 ID 獲取影響時對其進行二進制搜索),并維護一個排列索引陣列,告訴您在什么索引如果按影響力排序,則主集合的元素將是。像這樣的東西:
std::vector<std::pair<int,int>> influences;
// insert all elements sorted by ID
std::vector<decltype(influences)::size_type> sorted_indices;
// now sort by influences but modifying `sorted_indices` instead.
相關問題
如果 ID 都是從 0 到 N,你甚至可以只用 ID 索引影響:
std::vector<int> influences; // influences[id] is the influence value corresponding to id
這使您可以隨機訪問。
“正確”的選擇取決于您可能擁有的許多其他可能的限制。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/522826.html
標籤:C 字典stl
上一篇:試圖列印出帶有索引號的字典
