我有一個std::unordered_map<id, town_data> data,其中town_data 是一個struct不同的資訊 - 名稱(字串),稅收(int)和與首都的距離(int)。我應該構建一個std::vector<id>,按上述距離排序,從低到高。我很難弄清楚如何有效地做到這一點。我想我可以簡單地遍歷data,std::map<distance, id>通過該回圈/插入創建,按距離對其進行排序,除非默認情況下對地圖進行排序,然后將其逐鍵復制到新向量std::vector<id>. 但這似乎是非常浪費的做法。我在這里錯過了一些捷徑或更有效的解決方案嗎?
uj5u.com熱心網友回復:
您可以std::vector在地圖中創建一個迭代器,然后根據您的排序標準對迭代器進行排序。排序后,您可以將結果轉換為std::vector<id>.
創建一個std::vector迭代器:
std::vector<decltype(data)::iterator> its;
its.reserve(data.size());
for(auto it = data.begin(); it != data.end(); it)
its.push_back(it);
排序std::vector:
#include <algorithm> // std::sort, std::transform
std::sort(its.begin(), its.end(),
[](auto& lhs, auto&rhs) {
return lhs->second.distance < rhs->second.distance;
});
最后,將其轉換為std::vector<id>:
#include <iterator> // std::back_inserter
std::vector<id> vec;
vec.reserve(its.size());
std::transform(its.begin(), its.end(), std::back_inserter(vec),
[](auto it) {
return it->first;
});
uj5u.com熱心網友回復:
我認為id的向量可以直接排序如下,
std::vector<decltype(decltype(data)::value_type::second_type::id)> vec;
vec.reserve(data.size());
for(auto it = data.begin(); it != data.end(); it)
vec.push_back(it->second.id);
std::sort(vec.begin(), vec.end(), [&data](auto lhs, auto rhs) { return data[lhs].distance < data[rhs].distance; });
我想知道這是否比對town_data 的向量進行排序更有效,不是嗎?
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/388774.html
上一篇:為什么我在索引0處得到垃圾值
