在下面的第一个代码片段中,我试图基于提供给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
答案 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)