后续:从std :: vector中删除项目

时间:2013-02-22 13:26:58

标签: c++ stdvector

在下面的第一个代码片段中,我试图基于提供给std :: remove_if函数的静态条件函数从成员函数中的向量中删除元素。我的问题是removeVipAddress方法中的输入参数uuid无法在条件函数中访问。你觉得我应该怎么做才能根据名为​​uuid的输入参数从向量中删除一个项目?谢谢。注意:这是之前在Removing an item from an 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 个答案:

答案 0 :(得分:2)

如果您使用的是C ++ 11,可以使用lambda:

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

该函数调用的最后一个参数声明了一个lambda,它是一个匿名内联函数。 [uuid]位告诉它将uuid包含在lambda的范围内。

有关于lambdas here

的教程

或者你可能想提供一个构造函数&amp;成员函数到您的RemoveCond谓词(并使用operator()而不是名为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 );
     );

答案 1 :(得分:1)

如果您没有C ++ 11 lambdas,可以将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)