从vector的元素获取指针

问题描述 投票:1回答:1

我想从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));
}

或者也许还有其他更好的方法来编写代码?

c++
1个回答
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_ifstd::remove_if都与元素的数量呈线性关系。或者您可能希望保持users排序并使用std::equal_range()而不是std::find_if(),这是log(N),但你需要使用findUser找到插入或插入后使用std::sort的正确位置。

© www.soinside.com 2019 - 2024. All rights reserved.