第一件事是我不会使用 a std::list
,而是使用 a std::vector
。现在对于特定问题,您需要执行两个操作:生成容器,根据您的标准对其进行排序。
// Extract the data:
std::vector<Object*> v;
v.reserve( m.size() );
std::transform( m.begin(), m.end(),
std::back_inserter(v),
[]( const map<Object*, baseObject*>::value_type& v ) {
return v.first;
} );
// Order according to the values in the map
std::sort( v.begin(), v.end(),
[&m]( Object* lhs, Object* rhs ) {
return m[lhs]->id < m[rhs]->id;
} );
如果没有 C++11,您将需要创建仿函数而不是 lambda,如果您坚持返回 a,std::list
那么您应该使用std::list<>::sort( Comparator )
. 请注意,这可能效率低下。如果性能是一个问题(在你得到这个工作并且你分析并知道这实际上是一个瓶颈之后)你可能需要考虑使用中间map<int,Object*>
:
std::map<int,Object*> mm;
for ( auto it = m.begin(); it != m.end(); ++it )
mm[ it->second->id ] = it->first;
}
std::vector<Object*> v;
v.reserve( mm.size() ); // mm might have less elements than m!
std::transform( mm.begin(), mm.end(),
std::back_inserter(v),
[]( const map<int, Object*>::value_type& v ) {
return v.second;
} );
同样,这可能比原始版本...配置文件更快或更慢。