我想从vector的元素中获取一个指针,该元素的Fd
属性设置在所需的值上。现在我正在使用这个丑陋的代码:
User* Game::GetUser(int fd)
{
for(auto& v : users)
if (v.Fd == fd)
return &v;
return nullptr;
}
如何更改此代码与此类似:
void Game::RemoveUser(int fd)
{
users.erase(remove_if(begin(users), end(users), [fd](User const& u)
{
return u.Fd == fd;
}), end(users));
}
或许还有其他更好的方法可以对此进行编码?
答案 0 :(得分:3)
如何更改此代码以更加类似于此
只需使用相同谓词的std::find_if
:
User* Game::GetUser(int fd)
{
auto it = find_if(begin(users), end(users), [fd](User const& u)
{
return u.Fd == fd;
}));
return it == end(users) ? nullptr : &*it;
}
为了避免代码重复,您也可以使用find_if
的结果进行擦除:
users_type::iterator findUser( int fd)
{
return find_if(begin(users), end(users), [fd](User const& u)
{
return u.Fd == fd;
}));
}
User* Game::GetUser(int fd)
{
auto it = findUser( fd );
return it == end( users ) ? nullptr : &*it;
}
void Game::RemoveUser(int fd)
{
auto it = findUser( fd );
if( it != end(users) )
users.erase( it );
}
如果此类操作必须经常发生,您可以考虑使用不同的容器,因为std::find_if
和std::remove_if
都与元素数量成线性关系。或者,您可能希望将users
排序并使用std::equal_range()
而不是std::find_if()
log(N)
,但您需要使用findUser
来查找正确的位置插入后插入或使用std::sort
。