a std::list
(またはstd::vector
、さらに言えば) を使用している場合、重複を避けたくないが元の順序を維持したい場合は、線形検索を回避することはできません。シンプルな
std::vector
ソリューションは次のとおりです。
int
createIndex( std::vector<T>& references, T const& newValue )
{
int results = std::find( references.begin(), references.end(), newValue )
- references.begin();
if ( results == references.size() ) {
references.push_back( newValue );
}
return results;
}
または、次を使用できますstd::map
。
int
createIndex( std::map<T, int>& references, T const& newValue )
{
st::map<T, int>::iterator results = references.find( newValue );
if ( results == references.end() ) {
results = references.insert(
std::make_pair( newValue, references.size() ) ).first;
}
return results->second;
}
(これは が をT
サポートしていると仮定します<
。そうでない場合は、順序付け基準を確立する必要があります。またはunordered_map
、ハッシュ コードを使用して定義する必要があります。)