最初にstd::list
、 ではなく を使用しstd::vector
ます。特定の問題の時点で、2 つの操作を実行する必要があります。コンテナを生成し、条件に応じて並べ替えます。
// 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 を使用しない場合は、ラムダの代わりにファンクターを作成する必要があり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;
} );
繰り返しますが、これは元のバージョンよりも速くなったり遅くなったりする可能性があります... プロファイル。