【发布时间】:2016-12-01 00:50:19
【问题描述】:
我有一个std::vector<T> 和一个std::map<U, std::size_t>,其中映射充当索引向量的不同方式,即映射的键值对中的值是向量元素的索引。
我可以保证不仅键,而且地图的值都是唯一的。
现在,当我对向量应用 std::sort 时,显然会改变可以找到元素的索引,我想相应地更新我的地图。
我找到了this 对第二个向量应用排列的答案。我想要做的是将此排列应用于地图的值。
以下代码确实有效,但效率当然非常低
template <typename T, typename U>
std::vector<T> apply_permutation(const std::vector<T>& vec,
std::map<U, std::size_t>& m,
const std::vector<std::size_t>& p)
{
std::vector<T> sorted_vec(vec.size());
std::transform(p.begin(), p.end(), sorted_vec.begin(),
[&](std::size_t i){ return vec[i]; });
for (std::size_t i(0); i != p.size(); ++i)
for (auto it = m.begin(); it != m.end(); ++it)
if (it->second == p[i])
it->second = i;
return sorted_vec;
}
我正在寻找一种更有效的方法来保持矢量和地图同步。
【问题讨论】:
-
考虑 boost::multiindex。
-
你说得对,重新考虑这两个索引的设计是值得的。
标签: c++ c++11 permutation stdvector stdmap