0

このコードが安全で、未定義の動作がないかどうかを知りたいです。

 QueueMap::const_iterator it = m_3playersQueue.find(s->m_GameCode);
 if(it == m_3playersQueue.end())
 {
     std::deque<Session*> stack;
     stack.push_back(s);

     m_3playersQueue[s->m_GameCode] = stack;
     return;
 }

 const_cast<std::deque<Session*>&>(it->second).push_back(s);

 QueueMap is of type std::tr1::unordered_map< uint32, std::deque<Session*> >
4

3 に答える 3

4

あなたのコードは矛盾しています。QueueMap::iteratorの代わりに使用してQueueMap::const_iteratorください。

あなたがやっていることは、明示的にそれを const にしてから、ネスをconst_cast取り除くことです。constなぜわざわざ?

于 2012-05-19T17:13:55.810 に答える
1

次の形式では、コードを理解するのが少し簡単になる場合があります。常に挿入して更新します。

std::pair<QueueMap::iterator, bool> p =
  m_3playersQueue.insert(std::make_pair(s->m_GameCode, std::deque<Session*>()));

p.first->second.push_back(s);

唯一の非効率性は、要素がすでに存在する場合です。その場合、空のを破棄する必要がありますdeque。ただし、小さくて短期間のヒープ割り当ては通常は高価ではないため、より複雑なコードを正当化するために慎重にプロファイリングする必要があります。後継者がコードを処理してデバッグするのにどれくらいの時間がかかるか考えてみてください。

于 2012-05-19T18:26:17.130 に答える
1

はい、安全です。const_iteratorが と異なっていてもiterator、マップ内のオブジェクトは同じです。すべてのマップ コンテンツが変更可能なstd::deque<Session*>オブジェクトとして作成されている限り、constness をキャストしてもかまいません。

もちろん、 constness が伝えることを意図した不変条件に違反している可能性はありますが、それはconst_cast単独で行われる可能性があります。

于 2012-05-21T13:47:02.190 に答える