2013-02-22 2 views
2

В приведенном ниже фрагменте кода я пытаюсь удалить элемент из вектора внутри функции-члена на основе функции статического условия, введенной в функцию std :: remove_if , Моя проблема заключается в том, что входной параметр uuid в методе removeVipAddress не может получить доступ к функции условия. Как вы думаете, что я должен сделать здесь, чтобы разрешить удаление элемента из вектора на основе входного параметра с именем uuid? Благодарю. Примечание: Это прослеживание проблема объяснялось ранее в Removing an item from an std:: vectorПоследующие действия: Удаление элемента из std :: vector

SNIPPET 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()); 

} 

SNIPPET 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 

ответ

2

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

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

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

Там в учебник по лямбды here

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

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

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); 
    ); 
1

Если у вас нет C++ 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)); 

BTW вы removeVipAddress функция должна занять const ссылка:

void removeVipAddress(const std::string &uuid) 
Смежные вопросы