[英]Order a container by member with STL
假设我有一些数据存储在unique_ptr
的容器中:
struct MyData {
int id; // a unique id for this particular instance
data some_data; // arbitrary additional data
};
// ...
std::vector<std::unique_ptr<MyData>> my_data_vec;
my_data_vec
的顺序很重要。 假设我现在有另一个ID为MyDatas的向量:
std::vector<int> my_data_ids;
我现在想要重新排列my_data_vec
,使得元素按照my_data_ids
指定的顺序my_data_ids
。 (不要忘记移动unique_ptr
需要使用std::move()
移动语义。)
什么是实现这一目标的最具算法效率的方法,并且任何STL算法都能很好地实现这一目标吗? 我看不出std::sort
会有任何帮助。
编辑:我可以使用O(n)内存空间(不太担心内存),但ID是任意的(在我的特定情况下,它们实际上是随机生成的)。
my_data_ids
的索引。 std::unique_ptr<MyData>
。 std::sort
来使用该函数对象对my_data_vec
进行排序。 这是一个草图:
// Beware, brain-compiled code ahead!
typedef std::vector<int> my_data_ids_type;
typedef std::map<int,my_data_ids_type::size_type> my_data_ids_map_type;
class my_id_comparator : public std::binary_function< bool
, std::unique_ptr<MyData>
, std::unique_ptr<MyData> > {
public:
my_id_comparator(const my_data_ids_map_type& my_data_ids_map)
: my_data_ids_map_(my_data_ids_map) {}
bool operator()( const std::unique_ptr<MyData>& lhs
, const std::unique_ptr<MyData>& rhs ) const
{
my_data_ids_map_type::const_iterator it_lhs = my_data_ids_map_.find(lhs.id);
my_data_ids_map_type::const_iterator it_rhs = my_data_ids_map_.find(rhs.id);
if( it_lhs == my_data_ids_map_.end() || it_rhs == my_data_ids_map_.end() )
throw "dammit!"; // whatever
return it_lhs->second < it_rhs->second;
}
private
my_data_ids_map_type& my_data_ids_map_;
};
//...
my_data_ids_map_type my_data_ids_map;
// ...
// populate my_data_ids_map with the IDs and their indexes from my_data_ids
// ...
std::sort( my_data_vec.begin(), my_data_vec.end(), my_id_comparator(my_data_ids_map) );
如果内存不足,但时间无关紧要,您可以取消地图并搜索my_data_ids
向量中的ID以进行每次比较。 但是,你必须非常渴望内存才能做到这一点,因为每次比较的两个线性复杂操作将非常昂贵。
为什么不尝试将数据移动到STL集中? 你只需要实现比较功能,你最终会得到一组完美有序的数据。
为什么不直接使用map<int, unique_ptr<MyData>>
(或multimap
)?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.