4

私は次のように使用しboost::unordered_mapています

typedef boost::shared_ptr<WriterExeciter> PtrWriter;
typedef std::list<PtrWriter> PtrList; 
boost::unordered_map<std::pair<unsigned int, unsigned long long>, PtrList>  Map
Map instrMap;

PtrList、ループ内のタイプのリストにいくつかの変更を加えています

for(auto it = instrMap.begin(); it != instrMap.end(); ++it)
{
     auto key = it->first();
     auto list& = it->second();    
     //Make some change to an element in list 

      if(list.empty())
      {
            instMap.erase(key); 
      }



}
  1. リストを変更すると、instrMap の反復子が無効になりますか?

  2. 要素を消去すると、消去された要素を指す反復子が無効になります。これが問題を引き起こさないようにコードを変更するにはどうすればよいですか? it++の代わりに使用すると++it役立ちますか?

ありがとう

4

1 に答える 1

5

このerase()操作は反復子を無効にします。ただし、次の要素への有効な反復子も返します。したがって、次のようなものを使用できます。

for(auto it = instrMap.begin(); it != instrMap.end();)
{
     auto key = it->first();
     auto list& = it->second();    
     //Make some change to an element in list 

      if(list.empty())
      {
            it = instMap.erase(it); 
      }
      else {
            ++it;
      }
}
于 2012-07-12T00:36:13.573 に答える