我想从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));
}
或者也许还有其他更好的方法来编写代码?
如何将此代码更改为更类似于此
只需使用具有相同谓词的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
的正确位置。