Последующие действия: удаление элемента из std::vector

В первом фрагменте кода ниже я пытаюсь удалить элемент из вектора внутри функции-члена на основе функции статического условия, переданной в функцию std::remove_if. Моя проблема заключается в том, что входной параметр uuid в методе removeVipAddress не может быть доступен в функции условия. Как вы думаете, что я должен сделать здесь, чтобы разрешить удаление элемента из вектора на основе входного параметра с именем uuid? Спасибо. ПРИМЕЧАНИЕ. Это дополнительная проблема, описанная ранее в Удаление элемента из стандартного: : вектор

ФРАГМЕНТ 1 (КОД)

void removeVipAddress(std::string &uuid)
{
          struct RemoveCond
          {
            static bool condition(const VipAddressEntity & o)
            {
              return o.getUUID() == uuid;
            }
          };

          std::vector<VipAddressEntity>::iterator last =
            std::remove_if(
                    mVipAddressList.begin(),
                    mVipAddressList.end(),
                    RemoveCond::condition);

          mVipAddressList.erase(last, mVipAddressList.end());

}

ФРАГМЕНТ 2 (ВЫВОД КОМПИЛЯЦИИ)

 $ g++ -g -c -std=c++11 -Wall Entity.hpp
 Entity.hpp: In static member function ‘static bool ECLBCP::VipAddressSet::removeVipAddress(std::string&)::RemoveCond::condition(const   ECLBCP::VipAddressEntity&)’:
 Entity.hpp:203:32: error: use of parameter from containing function
 Entity.hpp:197:7: error:   ‘std::string& uuid’ declared here

person F. Aydemir    schedule 22.02.2013    source источник


Ответы (2)


Если вы используете С++ 11, это можно сделать с помощью лямбда:

auto last = std::remove_if(
     mVipAddressList.begin(),
     mVipAddressList.end(),
     [uuid]( const VipAddressEntity& o ){
          return o.getUUID() == uuid;
     });

Последний параметр в этом вызове функции объявляет лямбду, которая является анонимной встроенной функцией. Бит [uuid] сообщает ему о включении uuid в область действия лямбды.

Учебник по лямбда-выражениям здесь

В качестве альтернативы вы, вероятно, захотите предоставить конструктор и функцию-член для вашего предиката RemoveCond (и реализовать его с помощью оператора(), а не функции с именем condition).

Что-то вроде этого:

struct RemoveCond
{
    RemoveCond( const std::string& uuid ) :
    m_uuid( uuid )
    {
    }

    bool operator()(const VipAddressEntity & o)
    {
        return o.getUUID() == m_uuid;
    }

    const std::string& m_uuid;
};

std::remove_if( 
     mVipAddressList.begin(),
     mVipAddressList.end(),
     RemoveCond( uuid );
     );
person obmarg    schedule 22.02.2013

Если у вас нет лямбда-выражений С++ 11, вы можете выразить свой RemoveCond как функтор:

struct RemoveCond
{
  RemoveCond(const std::string uuid) : uuid_(uuid) {}
  bool operator()(const VipAddressEntity & o) const
  {
          return o.getUUID() == uuid_;
  }
  const std::string& uuid_;
};

затем передайте экземпляр std::remove_if:

std::remove_if(mVipAddressList.begin(),
               mVipAddressList.end(),
               RemoveCond(uuid));

Кстати, ваша removeVipAddress функция должна принимать ссылку const:

void removeVipAddress(const std::string &uuid)
person juanchopanza    schedule 22.02.2013