をマッピング私は、このようなコードを持っている:は、どのように私はSTDに挿入::より効率的に
struct Record{
std::string key;
// ...
};
void push_record(Record &out, std::map<std::string, int> &vmap){
const auto &it = vmap.find(out.key);
long pos;
if (it != vmap.end()){
pos = it->second;
}else{
pos = calculate_pos(out);
vmap.insert(Record(std::move(out.key), pos)); // here move
}
// use pos
}
がどのように私は、コードをより効率的にすることができますか?
現時点では、地図を2度参照するため、コードはあまり効率的ではありません。最初に値をチェックするときは最初に挿入し、2番目のときは挿入します。
std::move(out.key)
も使用したいので、これはvmap[out.key]
のようなものを使用しなかった理由です。
insert
に提案を渡すことができますが、良い例は見つかりませんでした。
'std :: map'の2つのルックアップのためにコードが遅いことは確かですか? 'std :: map'のルックアップは' O(log n) 'です。これは非常に大きなマップであってもかなり速くなければなりません。 – Holt
ほとんどの*本当の点は2つのルックアップではなく、あなたが挿入する必要があることを知っていない限り 'calculate_pos'呼び出しを避けるためです。そして関連しているのは、もしあなたの牛肉が本当にあなたの肉牛であるならば、注文が重要ではない(あなたは一方的にも別の方法も指定していない)場合、おそらく 'unordered_map'がもっと適しているでしょう。 – WhozCraig
実際にコードをコンパイルしていますか? 'vmap'は' std :: string、int'型ですが、 'Record'型のインスタンスを挿入します。 – marcinj