[C++] std :: map에서 항목을 필터링하는 방법?


Answers

Mark Ransom 알고리즘의 변형이지만 일시적인 필요성은 없습니다.

for(Actions::iterator it = _actions.begin();it != _actions.end();)
{
    if (expired(*it))
    {
        bar(*it);
        _actions.erase(it++);  // Note the post increment here.
                               // This increments 'it' and returns a copy of
                               // the original 'it' to be used by erase()
    }
    else
    {
        ++it;  // Use Pre-Increment here as it is more effecient
               // Because no copy of it is required.
    }
}
Question

나는 대략 다음 코드를 가지고있다. 이것이 더 좋거나 더 효율적으로 만들어 질 수 있을까요? 아마도 std::remove_if 있을까요? 그것을 가로 지르는 동안지도에서 항목을 제거 할 수 있습니까? 임시지도 사용을 피할 수 있습니까?

typedef std::map<Action, What> Actions;
static Actions _actions;

bool expired(const Actions::value_type &action)
{
  return <something>;
}

void bar(const Actions::value_type &action)
{
  // do some stuff
}

void foo()
{
  // loop the actions finding expired items
  Actions actions;
  BOOST_FOREACH(Actions::value_type &action, _actions)
  {
    if (expired(action))
      bar(action);
    else
      actions[action.first]=action.second;
    }
  }
  actions.swap(_actions);
}



아무도 알지 못하는 무언가는 지우개가 모든 컨테이너에서 사용될 때 새로운 보장 된 유효한 이터레이터를 반환한다는 것입니다.

Actions::iterator it = _actions.begin();
while (it != _actions.end())
{
  if (expired(*it))
  {
    bar(*it);
    it = _actions::erase(it);
  }
  else
    ++it;
}

이터레이터의 안정성이 보장되지 않기 때문에 actions.end ()를 저장하는 것이 좋은 계획은 아닐 것입니다.